聊一聊JVM (4)

对象被转移到了幸存区,幸存区又分为From Space和To Space,这两块区域是动态交换的,谁是空的谁就是To Space,然后From Space就会把全部对象转移到To Space去;

那如果两块区域都不为空呢?这就用到了复制算法,其中一个区域会将存活的对象转移到另一个区域去,然后将自己区域的内存空间清空,这样该区域为空,又成为了To Space

所以每次触发轻GC后,Eden区清空,同时To区也清空了,所有的对象都在From区

好处:没有内存碎片

坏处:浪费内存空间(浪费幸存区一半的空间);对象存活率较高的场景下,需要复制的东西太多,效率会下降。

最佳使用环境:对象存活率较低的时候,也就是年轻代。

标记-清除算法

为每个对象存储一个标记位,记录对象的生存状态。

标记阶段:这个阶段内,为每个对象更新标记位,检查对象是否死亡。

清除阶段:该阶段对死亡的对象进行清除,执行GC操作。

缺点:两次扫描严重浪费时间;会产生内存碎片

优点:不需要额外的空间

标记-整理算法

这个是标记-清除算法的一个改进版,又叫做标记-清除-压缩算法。不同的是在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存货的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。可以进一步优化,在内存碎片不太多的情况下,就继续标记清除,到达一定量的时候再压缩。

有没有最优的算法?

​ 没有最优算法,只有最合适的。

​ GC也称为分代收集算法,对于年轻代,对象存活率低用复制算法;对于老年代,区域大,对象存活率高,用标记清除+标记压缩混合实现。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspppz.html