手机网站怎样排版最好,东莞常平招聘网最新招聘信息,企业营销型网站应该有哪些内容,微官网和手机网站一样吗如何判断对象“无用”#xff1f;
关于判断对象是否无用的算法#xff0c;在JVM的发展过程中出现过两种算法#xff1a;一种是引用计数和根集算法。
引用计数算法
例如下图中的object1的引用计数是2#xff0c;GC的时候不回收#xff0c;object6、object7引用计数为0
关于判断对象是否无用的算法在JVM的发展过程中出现过两种算法一种是引用计数和根集算法。
引用计数算法
例如下图中的object1的引用计数是2GC的时候不回收object6、object7引用计数为0GC的时候要被回收。引用计数有个缺点当引用产生闭环的时候即便是对象实际上已经“无用”也无法回收了例如下图中的 object4、object5、object8直接引用关系。 引用计数算法
根集算法
引用计数算法简高效早期的 Java 虚拟机中使用这个方式但是正如上面提到的不能解决“引用闭环”的问题后来的 Java 虚拟机中普普采用根集算法。从 GCRoot比如一个静态变量 开始遍历引用关系能遍历到的叫做引用可达遍历不到的叫做不可达。不可达的对象就被判“死刑了”GC的时候将被枪毙掉。 根集算法
对象回收之后的内存如何处置
人死了、遗产处理不好会产生很多纠纷所以有法律制度。在 JVM 的世界里对象死了剩下的“遗产”无非就是它占据的那片内存空间。对象死后生下的那部分内存空间进行一下规划的具体算法有三种。 三种回收算法.png
标记清除
标记就是把那些“无用的对象”标记一下被标记的对象等于被判了死刑也就是就可以回收了清除就是变那些被标记了的对象清楚掉。 GC标记之后的状态 清除之后的状态
我们发现清除之后的状态其中的可用内存并不是连续的也就是说内存存在碎片如果创建一个大对象无法分配到足够大的连续内存空间使得GC不得不做一次重新整理。由于可用对象和无用对象直接的内存不是连续的所以标记的过程是要遍历识别内存区域的清除的过程也是要遍历识别的整个过程效率比较低。
标记复制
标记的过程不变。把内存划分为两部分一部分叫做预留区域下图虚线框中不分配对象。在GC的时候把那些正在使用的对象复制到预留区域然后再把非预留区域以外的内存全部清除。 标记之后内存状态 复制之后内存状态 清除之后内存状体
解决了效率和内存碎片的问题但是代价是昂贵的牺牲了1/2的内存显然在很多情况下是无法接受的。
标记整理
标记的过程依然不变标记之后处于内存末端区域的正在使用的对象向前移动占据覆盖那些被标记了的区域有一种碾压的感觉把正在使用的对象赶到一起再把剩余的标记对象全部清除。 标记之后内存状体 移动之后的内存状态 清除之后内存状体
分代混合算法
在现代虚拟机通常就是 HotSpot(TM)使用的分代算法来处理内存并没有什么新意只是针对对象的生命周期范围来划分区域不同的区域使用不同的算法。一般分为新生代和老生代新生代由于生命不长GC的时候大部分对象已经死亡所以有足够的空间作为担保可用使用标记复制算法对于老生代老生代使用标记清除或标记整理算法。 分代混合算法
Stop the world 抬脚打扫卫生.png
想象一下你不可能在妈妈一边打扫卫生的时候你一边扔垃圾吧她当然希望你乖乖做在沙发上抬起脚来别动。JVM的世界亦如此前面我们说道使用引用关系的根集算法来标记对象是否无用二这个引用关系只是某一时刻的“快照”使用一个叫做OopMap的数据结构来保存的。引用关系是会随时间变化的所以在垃圾回收器进行垃圾回收时候就必须的有所停顿sun把这个现象叫做“Stop the world ”。
所以频繁的GC会影响性能对象存活时间过长会占用内存在实际开发过程中我们如何去平衡内存空间和执行效率、如何去选择对象生命周期是非常重要的。 为了让学习变得轻松、高效今天给大家免费分享一套Java教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群928505736