jvm垃圾回收之复制算法——为什么分两块Survivor空间

复制算法的两块Survivor空间
 
概述
 
在《深入理解Java虚拟机》这本书中,对复制算法有一段这样的介绍:现在的商业虚拟机大多采用复制算法来收集新生代。复制算法将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor空间,当回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor上,最后清理掉Eden和刚才使用的空间。对虚拟机不是很熟悉的同学,应该会有这样的疑问:为什么硬要分成两块Survivor空间呢,明明其中一块跟Eden的功能是一样的。
 
 
 
复制算法原理  
 
Survivor区,一块叫From,一块叫To,对象存在Eden和From块。当进行GC时,Eden存活的对象全移到To块,而From中,存活的对象按年龄值确定去向,当达到一定值(年龄阈值,通过-XX:MaxTenuringThreshold可设置)的对象会移到年老代中,没有达到值的复制到To区,经过GC后,Eden和From被清空。
 
  之后,From和To交换角色,新的From即为原来的To块,新的To块即为原来的From块,且新的To块中对象年龄加1.
 
 
 
疑问
 
只分一块Survivor区,当进行GC时,先将Survivor区中存活的对象达到年龄值的移入年老代,清除已死亡的对象,后将Eden区中存活的对象移入Survivor区,将Survivor区的对象年龄都加1.这样与分两块Survivor有什么区别呢,为什么虚拟机一定要分成两块呢?
 
 
 
解答
 
在查阅百度及和小伙伴讨论后,得出一个结论,有不妥之处或有更好的想法,欢迎指正。
 
即若只分一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移走,剩下的对象直接清理即可。
 
另外,分成两块Survivor,From和To分工明确,逻辑理解和技术实现较简单。

 

你可能感兴趣的:(jvm垃圾回收之复制算法——为什么分两块Survivor空间)