具有品牌的做网站,零基础如何做电商,摄像头监控视频怎么做直播网站,hqz行情站虚拟机栈占用的是操作系统内存#xff0c;每个线程对应一个虚拟机栈#xff0c;它是线程私有的#xff0c;生命周期和线程一样#xff0c;每个方法被执行时产生一个栈帧#xff08;Statck Frame#xff09;#xff0c;栈帧用于存储局部变量表、动态链接、操作数和方法出…
虚拟机栈占用的是操作系统内存每个线程对应一个虚拟机栈它是线程私有的生命周期和线程一样每个方法被执行时产生一个栈帧Statck Frame栈帧用于存储局部变量表、动态链接、操作数和方法出口等信息当方法被调用时栈帧入栈当方法调用结束时栈帧出栈。
局部变量表中存储着方法相关的局部变量包括各种基本数据类型及对象的引用地址等因此他有个特点内存空间可以在编译期间就确定运行时不再改变。
虚拟机栈定义了两种异常类型StackOverFlowError(栈溢出)和OutOfMemoryError内存溢出。如果线程调用的栈深度大于虚拟机允许的最大深度则抛出StackOverFlowError不过大多数虚拟机都允许动态扩展虚拟机栈的大小所以线程可以一直申请栈直到内存不足时抛出OutOfMemoryError。
2.4 本地方法栈Native Method Stack
本地方法栈用于支持native方法的执行存储了每个native方法的执行状态。本地方法栈和虚拟机栈他们的运行机制一致唯一的区别是虚拟机栈执行Java方法本地方法栈执行native方法。在很多虚拟机中如Sun的JDK默认的HotSpot虚拟机会将虚拟机栈和本地方法栈一起使用。
2.5 程序计数器Program Counter Register
程序计数器是一个很小的内存区域不在RAM上而是直接划分在CPU上程序猿无法操作它它的作用是JVM在解释字节码.class文件时存储当前线程执行的字节码行号只是一种概念模型各种JVM所采用的方式不一样。字节码解释器工作时就是通过改变程序计数器的值来取下一条要执行的指令分支、循环、跳转等基础功能都是依赖此技术区完成的。
每个程序计数器只能记录一个线程的行号因此它是线程私有的。
如果程序当前正在执行的是一个java方法则程序计数器记录的是正在执行的虚拟机字节码指令地址如果执行的是native方法则计数器的值为空此内存区是唯一不会抛出OutOfMemoryError的区域。
三、GC机制
随着程序的运行内存中的实例对象、变量等占据的内存越来越多如果不及时进行回收会降低程序运行效率甚至引发系统异常。
在上面介绍的五个内存区域中有3个是不需要进行垃圾回收的本地方法栈、程序计数器、虚拟机栈。因为他们的生命周期是和线程同步的随着线程的销毁他们占用的内存会自动释放。所以只有方法区和堆区需要进行垃圾回收回收的对象就是那些不存在任何引用的对象。
3.1 查找算法
经典的引用计数算法每个对象添加到引用计数器每被引用一次计数器1失去引用计数器-1当计数器在一段时间内为0时即认为该对象可以被回收了。但是这个算法有个明显的缺陷当两个对象相互引用但是二者都已经没有作用时理应把它们都回收但是由于它们相互引用不符合垃圾回收的条件所以就导致无法处理掉这一块内存区域。因此Sun的JVM并没有采用这种算法而是采用一个叫——根搜索算法如图 image.png
基本思想是从一个叫GC Roots的根节点出发向下搜索如果一个对象不能达到GC Roots的时候说明该对象不再被引用可以被回收。如上图中的Object5、Object6、Object7虽然它们三个依然相互引用但是它们其实已经没有作用了这样就解决了引用计数算法的缺陷。
补充概念在JDK1.2之后引入了四个概念强引用、软引用、弱引用、虚引用。 强引用new出来的对象都是强引用GC无论如何都不会回收即使抛出OOM异常。 软引用只有当JVM内存不足时才会被回收。 弱引用只要GC,就会立马回收不管内存是否充足。 虚引用可以忽略不计JVM完全不会在乎虚引用你可以理解为它是来凑数的凑够四大天王。它唯一的作用就是做一些跟踪记录辅助finalize函数的使用。
最后总结什么样的类需要被回收
a.该类的所有实例都已经被回收 b.加载该类的ClassLoad已经被回收 c.该类对应的反射类java.lang.Class对象没有被任何地方引用。
3.2 内存分区
内存主要被分为三块新生代Youn Generation、旧生代Old Generation、持久代Permanent Generation。三代的特点不同造就了他们使用的GC算法不同新生代适合生命周期较短快速创建和销毁的对象旧生代适合生命周期较长的对象持久代在Sun Hotpot虚拟机中就是指方法区有些JVM根本就没有持久代这一说法。 image.png
新生代Youn Generation大致分为Eden区和Survivor区Survivor区又分为大小相同的两部分FromSpace和ToSpace。新建的对象都是从新生代分配内存Eden区不足的时候会把存活的对象转移到Survivor区。当新生代进行垃圾回收时会出发Minor GC也称作Youn GC。
旧生代Old Generation旧生代用于存放新生代多次回收依然存活的对象如缓存对象。当旧生代满了的时候就需要对旧生代进行回收旧生代的垃圾回收称作Major GC也称作Full GC。
持久代Permanent Generation在Sun 的JVM中就是方法区的意思尽管大多数JVM没有这一代。
3.3 GC算法
常见的GC算法复制、标记-清除和标记-压缩
复制复制算法采用的方式为从根集合进行扫描将存活的对象移动到一块空闲的区域如图所示 image.png
当存活的对象较少时复制算法会比较高效新生代的Eden区就是采用这种算法其带来的成本是需要一块额外的空闲空间和对象的移动。
标记-清除该算法采用的方式是从跟集合开始扫描对存活的对象进行标记标记完毕后再扫描整个空间中未被标记的对象并进行清除。标记和清除的过程如下 image.png
上图中蓝色部分是有被引用的对象褐色部分是没有被引用的对象。在Marking阶段需要进行全盘扫描这个过程是比较耗时的。 image.png
清除阶段清理的是没有被引用的对象存活的对象被保留。
标记-清除动作不需要移动对象且仅对不存活的对象进行清理在空间中存活对象较多的时候效率较高但由于只是清除没有重新整理因此会造成内存碎片。
标记-压缩该算法与标记-清除算法类似都是先对存活的对象进行标记但是在清除后会把活的对象向左端空闲空间移动然后再更新其引用对象的指针如下图所示 image.png
由于进行了移动规整动作该算法避免了标记-清除的碎片问题但由于需要进行移动因此成本也增加了。该算法适用于旧生代
四、垃圾收集器
在JVM中GC是由垃圾回收器来执行所以在实际应用场景中我们需要选择合适的垃圾收集器下面我们介绍一下垃圾收集器。
4.1 串行收集器Serial GC
Serial GC是最古老也是最基本的收集器但是现在依然广泛使用JAVA SE5和JAVA SE6中客户端虚拟机采用的默认配置。比较适合于只有一个处理器的系统。在串行处理器中minor和major GC过程都是用一个线程进行回收的。它的最大特点是在进行垃圾回收时需要对所有正在执行的线程暂停stop the world对于有些应用是难以接受的但是如果应用的实时性要求不是那么高只要停顿的时间控制在N毫秒之内大多数应用还是可以接受的而且事实上它并没有让我们失望几十毫秒的停顿对于我们客户机是完全可以接受的该收集器适用于单CPU、新生代空间较小且对暂停时间要求不是特别高的应用上是client级别的默认GC方式。
4.2 ParNew GC
基本和Serial GC一样但本质区别是加入了多线程机制提高了效率这样它就可以被用于服务端上server同时它可以与CMS GC配合所以更加有理由将他用于server端。
4.3 Parallel Scavenge GC
在整个扫描和复制过程采用多线程的方式进行适用于多CPU、对暂停时间要求较短的应用是server级别的默认GC方式。
4.4 CMS (Concurrent Mark Sweep)收集器
该收集器的目标是解决Serial GC停顿的问题以达到最短回收时间。常见的B/S架构的应用就适合这种收集器因为其高并发、高响应的特点CMS是基于标记-清楚算法实现的。
CMS收集器的优点并发收集、低停顿但远没有达到完美
自我介绍一下小编13年上海交大毕业曾经在小公司待过也去过华为、OPPO等大厂18年进入阿里一直到现在。
深知大多数初中级Android工程师想要提升技能往往是自己摸索成长或者是报班学习但对于培训机构动则近万的学费着实压力不小。自己不成体系的自学效果低效又漫长而且极易碰到天花板技术停滞不前
因此收集整理了一份《2024年Android移动开发全套学习资料》初衷也很简单就是希望能够帮助到想自学提升又不知道该从何学起的朋友同时减轻大家的负担。 既有适合小白学习的零基础资料也有适合3年以上经验的小伙伴深入学习提升的进阶课程基本涵盖了95%以上Android开发知识点真正体系化
由于文件比较大这里只是将部分目录截图出来每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频并且会持续更新
如果你觉得这些内容对你有帮助可以扫码获取备注Android 最后
现在都说互联网寒冬其实无非就是你上错了车且穿的少技能要是你上对车自身技术能力够强公司换掉的代价大怎么可能会被裁掉都是淘汰末端的业务Curd而已现如今市场上初级程序员泛滥这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期想要年后突破自己涨薪的进阶Android中高级、架构师对你更是如鱼得水 为什么某些人会一直比你优秀是因为他本身就很优秀还一直在持续努力变得更优秀而你是不是还在满足于现状内心在窃喜 Android架构师之路很漫长一起共勉吧
《Android学习笔记总结移动架构视频大厂面试真题项目实战源码》点击传送门即可获取
为他本身就很优秀还一直在持续努力变得更优秀而你是不是还在满足于现状内心在窃喜
Android架构师之路很漫长一起共勉吧
《Android学习笔记总结移动架构视频大厂面试真题项目实战源码》点击传送门即可获取