Parallel Scavenge收集器Eden空间不足以分配时行为与Serial收集器Eden空间不足以分配时行为的不同

在运行深入理解Java虚拟机中的新生代MinorGC示例时,发现实际行为跟示例中的不符。下面为MinorGC示例:

package org.example.third;

/**
 * 新生代Minor GC
 */
public class TestAllocation {
    private static final int _1MB = 1024 * 1024;

    /**
     * VM参数: -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
     * 64位虚拟机只支持server模式下运行,可以使用-XX:+UseSerialGC参数使虚拟机采用Serial + Serial Old的收集器组合进行内存回收
     */
    public static void main(String[] args) {
        byte[] allocation1, allocation2, allocation3, allocation4;
        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        allocation4 = new byte[4 * _1MB];   //出现一次Minor GC
    }
}

原因在于现在计算机大多都是64位的,仅支持server模式运行虚拟机,而client模式才是默认采用Serial收集器。
通过打印虚拟机默认参数发现了其中带有 -XX:+UseParallelGC参数,也就是说默认运行的是Parallel Scavenge收集器。
Serial收集器当Eden空间不足以分配时,发生新生代收集,但是发现Survivor空间无法存放所有的存活对象,于是通过担保机制将存活的对象放入老年代,
也就是说allocation1 2 3被放入老年代,allocation4被分配致Eden区。
而Parallel Scavenge收集器在Eden空间不足以分配时,会先判断此次分配的对象是否大于等于Eden空间的大小,此时Eden空间大小为新生代大小减去两个Survivor空间大小,
也就是10M-2M=8M,此时4M大于等于8M,所以allocation4直接被分配到老年代。

其中对于Parallel Scavenge收集器的行为是看https://blog.csdn.net/weixin_43194122/article/details/91526740理解的.

posted @ 2021-07-09 08:17  luotuoccc  阅读(49)  评论(0)    收藏  举报