在JVM GC的分代机制中,年轻代中有两个Survivor区,为了便于交换,需要保证其中一个为空,这个容易理解,但是为什么需要两个Survivor区,而且很多网上资料中说在特殊情况下,可以配置为多个,并没有说怎么配置,也没有说是什么特殊情况。
下面是一个小小的可以借鉴的原因,是从http://www.iteye.com/topic/894148看到的:
1)感觉这是和GC的copying算法相关吧,既然是拷贝,就得有地方做from,有地方做to。
2)嗯,正是如此。在原始的copying收集算法里,空间被分为两半,叫做semispace。空间分配和回收的过程就是把其中一半用作from来分配空间,当from快满或满足别的一些条件时将可到达的对象复制到to,并将from与to逻辑交换的过程。
单纯的copying收集不能很好的应对长时间存活的对象,因为那样的对象每次经历收集的时候都还活着,带来拷贝的开销。出于权衡,HotSpot里目前除G1外都采用相似的方式实现分代式GC,并且在young gen都使用copying收集算法。不过它使用的copying算法是原始算法的变种,留一块较大的区域作为eden,在eden与old gen之间设置semispace来作为缓冲,让“中等寿命”的对象尽量在进入old gen之前被收集掉。这就是HotSpot的survivor spaces了。
嗯虽说是相似的方式,不过HotSpot里Parallel Scavenge与另外几种GC在实现上有点不同。其它的几种是共用了一套从JDK 1.4开始用的分代式GC框架,Parallel Scavenge则是自己实现了类似的功能而没用那套框架
但这仍然不能解释为什么只需要两个Survivor区。个人感觉是为了提高效率,只有两个空间来相互交换,当有三个空间时,根据已存的算法,此时就有两个空间空着啦,木有任何意义,但是可以改进算法啊,此时又陷入迷惑当中,寻求真实原因,求大牛解释。