今天看《深入研究java虚拟机原理》,上面提到复制算法的时候说一般将堆内存分为一块较大的Eden和两块较小的Survivor,默认大小比例为Eden:Survivor0:Survivor1=8:1:1,每次分配内存只使用Eden和其中一块Survivor,当发生垃圾搜集时,将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor上,最后清理掉Eden和刚才用过的Survivor。
在这里,有个疑问,为什么是两个Survivor,而不是一个或者其他数量呢
如果只有一个Survivor区,第一次YGC时Eden区的可以进入Survivor区,那下一次YGC时呢,由于Survivor已满,那么其实本次YGC进入Survivor区的对象必须在下次YGC时进入年老代或被回收,这样YGC的效率就不高了,这肯定都不是我们希望的。
而两个Survivor的话就不一样了,第一次YGC时Eden区和Survivor 0的可以进入Survivor 1区,
然后清理掉Eden和刚才用过的Survivor 0,接下来把Survivor 0 留作下次GC时,Eden和Survivor1存活下来的对象的存放地方,也即是说两个Survivor区来回交替使用。
正是因为存在两个Survivor区,使得Survivor区的对象也可以来回复制,而不是马上进入老年代,直到达到一定年龄才能进入老年代,尽可能保证进入老年代的是真的够资格的。
网友评论