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理解的.

浙公网安备 33010602011771号