JVM中Minor GC与 Full GC 的触发条件

Minor GC(新生代GC)触发条件:Eden(伊甸园)空间不足。

Full GC(老年代GC)触发条件:

模拟前提VMoptions:

-XX:+UseSerialGC -Xms200M -Xmx200M -Xmn32m -XX:SurvivorRatio=8 -XX:+PrintGCDetails

1.(手动)直接调用System.gc();

 List list = new ArrayList();
        for (int i = 0;i < 100;i++){
            list.add(new byte[1024*1024*100]);
            if (i % 10 == 0){
                System.gc();
            }
        } 
  

JVM中Minor GC与 Full GC 的触发条件_第1张图片

2.老年代空间不足;

        //模拟fullgc场景
        //老年代空间不足
        //按照上面的参数推算:老年代大小: 200 -32m = 168M

        byte [] MAXOBJ = new byte [1024 * 1024 * 100]; // 100M

        byte [] MAXOBJ2 = new byte [1024 * 1024 * 68]; // 60M
        
        MAXOBJ = null;

        byte [] MAXOBJ3 = new byte [1024 * 1024 * 100]; // 60M

JVM中Minor GC与 Full GC 的触发条件_第2张图片

3.永久代空间不足

        //模拟fullgc场景
        //持久代空间不足
        List list = new ArrayList();
        int i = 0;
        while (true)
        {
            list.add(String.valueOf("ABCD:"  + i ++).intern());
        }

 

JVM中Minor GC与 Full GC 的触发条件_第3张图片

4.GC担保失败

5.Cocurrent mode failure

6.Minor GC 时,survivor放不下,对象只能放入老年代,而此时老年代也放不下

调优策略:增大survivor space、老年代空间

7.通过Minor GC后进入老年代的平均大小大于老年代的连续可用内存(Minor GC 时会做一个判断,统计之前晋升到老年代的对象的平均大小)

例如程序第一次触发Minor GC后,有6MB的对象晋升到老年代,那么当下一次Minor GC发生时,首先检查老年代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。

8.方法空间不足

调优策略:增大方法区空间、转为使用CMS GC

你可能感兴趣的:(JVM中Minor GC与 Full GC 的触发条件)