深入理解JAVA虚拟机——垃圾回收
Survivor的作用
当没有Survivor时,如果增加老年代空间,需要更多存活对象才能填满老年代,这样可以降低Full GC的频率;但是,随着老年代空间加大,一旦发生Full GC,执行所需要的时间更长。
如果减少老 年代空间,虽然Full GC所需时间减少;但是,老年代很快被存活对象填满,Full GC频率增加。
因此,Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生。
为什么要两个Survivor
解释一:为了解决碎片化。如果只有一个Survivor,对象在Eden创建,GC时存活对象复制到Survivor,当下次GC时,没有一个空闲的Survivor,而Survivor中也会有可回收对象,这样在Survivor中就出现了大量的空闲碎片。如果有两个Survivor,每次GC将Eden和其中一个Survivor中的存活对象复制到另一个Survivor,前一个Survivor会因此空闲,于是下次GC可以重复这样的过程,从而解决了碎片化。
解释二:复制算法将内存等分为两块,每次只使用其中一块,GC时将存活对象移至另一块,前一块因此空闲。引入Eden可以视为对内存利用的优化,相当于两个Survivor共享的区域,每次GC后Eden都会因此空闲,这样相当于扩大了Survivor,避免频繁GC。