美文网首页
JVM中新生代为什么要有两个Survivor

JVM中新生代为什么要有两个Survivor

作者: 浪够_ | 来源:发表于2020-06-10 11:20 被阅读0次

    今天看《深入研究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区的对象也可以来回复制,而不是马上进入老年代,直到达到一定年龄才能进入老年代,尽可能保证进入老年代的是真的够资格的。

    相关文章

      网友评论

          本文标题:JVM中新生代为什么要有两个Survivor

          本文链接:https://www.haomeiwen.com/subject/uhdutktx.html