问题描述
设置堆大小20MB,年轻代10MB,Eden与Survivor为8:1
依次生成2MB,2MB,2MB,4MB的对象
执行main()中分配alcation4对象的语句时会发生一次MinorGC。这次GC发生的原因是给allocation4分配内存的时候,发现Eden已经被占用了6MB,剩余空间已不足以分配allocation4所需的4MB内存,因此发生Minor GC。GC期间虚拟机又发现已有的3个2MB大小的对象全部无法放人Surivor空间(Survor空间只有1MB大小),所以只好通过分配担保机制提前转移到老年代去。
相关代码
运行环境:jdk1.8.0_151
java参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
public class MinorGC {
private static final int _1MB = 1024 * 1024;
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];
}
}
期望
这次GC结束后,4MB的allocation4对象顺利分配在Eden中,因此程序执行完的结果是Eden占用4MB(被allocation4占用),Survivor空闲,老年代被占用6MB(被allocation1,allocation2,allocation3占用)。