Minor GC(新生代GC)触发条件:Eden(伊甸园)空间不足。
Full GC(老年代GC)触发条件:
模拟前提VMoptions:
-XX:+UseSerialGC -Xms200M -Xmx200M -Xmn32m -XX:SurvivorRatio=8 -XX:+PrintGCDetails
1.(手动)直接调用System.gc();
List<Object> list = new ArrayList<Object>();
for (int i = 0;i < 100;i++){
list.add(new byte[1024*1024*100]);
if (i % 10 == 0){
System.gc();
}
}
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
3.永久代空间不足
//模拟fullgc场景
//持久代空间不足
List<String> list = new ArrayList<String>();
int i = 0;
while (true)
{
list.add(String.valueOf("ABCD:" + i ++).intern());
}
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