-Xms41m
-Xmx41m
-Xmn10m
-XX:+UseParallelGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
public class GCTest {
public static void main(String[] args) throws Exception {
List caches = new ArrayList();
for (int i = 0; i < 7; i++) {
System.out.println("次数:" + (i + 1));
caches.add(new byte[1024 * 1024 * 3]);
}
caches.clear();
for (int i = 0; i < 2; i++) {
System.out.println("clear后次数:" + (i + 1));
caches.add(new byte[1024 * 1024 * 3]);
}
}
}
java -jar GCTest -Xms30m -Xmx30m -Xmn10m -XX:+UseParallelGC -XX:+PrintGCDetails
每次放3M
1、在YGC执行前,min(目前 eden 已使用的大小,之前平均晋升到old的大小中的较小值) > old剩余空间大小 ? 不执行YGC,直接执行Full GC : 执行YGC;
2、在YGC执行后,平均晋升到old的大小 > old剩余空间大小 ? 触发Full GC : 什么都不做。
eden | old | YGC | FGC | 说明 | |
---|---|---|---|---|---|
第1次 | 3 | 0 | 0 | 0 | |
第2次 | 6 | 0 | 0 | 0 | |
第3次 | 3 | 6 | 1 | 0 | eden空间剩余2,小于需要的内存,min(eden已使用大小是6,平均进入old的大小是0)=0,小于old剩余的空间20,所以触发YGC,eden的对象进入old,old变成6,eden变成3。平均晋升到old的大小是6,小于old剩余的空间14,不触发FGC。 |
第4次 | 6 | 6 | 0 | 0 | |
第5次 | 3 | 12 | 1 | 0 | eden空间剩余2,小于需要的内存,min(eden已使用大小是6,平均进入old的大小是6)=6,小于old剩余的空间12,所以触发YGC,eden的对象进入old,old变成12,eden变成3。平均晋升到old的大小是6,小于old剩余的空间8,不触发FGC。 |
第6次 | 6 | 12 | 0 | 0 | |
第7次 | 3 | 18 | 1 | 1 | eden空间剩余2,小于需要的内存,min(eden已使用大小是6,平均进入old的大小是6)=6,小于old剩余的空间8,所以触发YGC,eden的对象进入old,old变成18,eden变成3。平均晋升到old的大小是6,大于old剩余的空间2,触发FGC。 |
第8次 | 6 | 18 | 0 | 0 | |
第9次 | 3 | 18 | 0 | 1 | eden空间剩余2,小于需要的内存,min(eden已使用大小是6,平均进入old的大小是6)=6,大于old剩余的空间2,直接触发FGC。 |