本篇文章主要是模擬JVM發生Full GC的情況。
1、JVM的參數設置
JVM參數設置(JDK1.8)
-XX:InitialHeapSize=20971520
-XX:MaxHeapSize=20971520
-XX:NewSize=10485760
-XX:MaxNewSize=10485760
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=15
-XX:PretenureSizeThreshold=3145728/5242880
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:gc.log
2、老年代可用空間小於新生代存活對象所佔空間,沒有開啓空間擔保參數,觸發FullGC。
2.1.Java 代碼
public class GCDemo_06 {
public static void main(String[] args) {
byte[] array_1 = new byte[4 * 1024 * 1024];
array_1 = null;
byte[] array_2 = new byte[2 * 1024 * 1024];
byte[] array_3 = new byte[2 * 1024 * 1024];
byte[] array_4 = new byte[2 * 1024 * 1024];
byte[] array_5 = new byte[128 * 1024];
byte[] array_6 = new byte[2 * 1024 * 1024];
}
}
2.2.過程分析
1.新生代大小10M,Eden大小8M,from大小1M,to大小1M,XX:PretenureSizeThreshold=3145728(大於3M對象直接進入老年代)。
2.創建一個4M的數據,這個對象直接進入老年代,然後這個對象不再被引用。
3.創建三個2M的數據,一個128K的數組,此時Eden區域大約7M多。
4.創建一個2M的數據,Eden區域放不下,觸發YoungGC。
5.此時Eden區域7M多內存加上Old區域4M內存,Old區域放不下,觸發FullFC。
3、老年代可用空間小於新生代平均進入老年代的大小,提前觸發Full GC。
3.1.Java代碼
public class GCDemo_07 {
public static void main(String[] args) {
byte[] array_1 = new byte[3 * 1024 * 1024];
array_1 = new byte[3 * 1024 * 1024];
byte[] array_2 = new byte[3* 1024 * 1024];
array_2 = new byte[3* 1024 * 1024];
byte[] array_3 = new byte[3* 1024 * 1024];
array_3 = new byte[3* 1024 * 1024];
byte[] array_4 = new byte[3* 1024 * 1024];
array_1 = null;
array_2 = null;
array_3 = null;
array_4 = null;
byte[] array_5 = new byte[3* 1024 * 1024];
array_5 = null;
byte[] array_6 = new byte[1* 1024 * 1024];
array_6 = new byte[512 * 1024];
array_6 = new byte[256 * 1024];
array_6 = new byte[256 * 1024];
}
}
3.2.過程分析
1、新生代大小10M,Eden大小8M,from大小1M,to大小1M,XX:PretenureSizeThreshold=5242880(大於5M對象直接進入老年代)。
2、第一次YoungGC
1.創建一個3M數組array_1,array_1指向第二個3M數組,原來指向的數組可以被GC清除。
2.創建一個3M數組array_2,Eden區域大小不夠,引發YoungGC。
3.array_1的3M數組進入老年代。
4.此時老年代使用空間3M:一個array_1的3M數組。
3、第二次YoungGC
1.array_2指向另一個3M數組,原來向的數組可以被GC清除。
2.創建一個3M數組array_3,Eden區域大小不夠,引發YoungGC。
3.array_2的3M數組進入老年代。
4.此時老年代使用空間6M:一個array_1的3M數組,一個array_2的3M數組。
4、第三次YoungGC
1.array_3指向另一個3M數組,原來指向的數組可以被GC清除。
2.創建一個3M數組array_4,Eden區域大小不夠,引發YoungGC。
3.array_3的3M數組進入老年代。
4.此時老年代使用空間9M:一個array_1的3M數組,一個array_2的3M數組,一個array_3的3M數組。
5、第四次YoungGC引發FullGC
1.將array_1、array_2、array_3,array_4,array_5設置爲null,表示可以被GC清除。
2.創建一個3M數組array_5,一個1M數組,一個512K數組,兩個256K數組。
3.此時Eden區域內存大小不夠,引發YoungGC。 4.此時老年代使用空間9M,老年代老年代剩餘空間1M,歷次進入老年代平均大小3M,老年代可以空間小於新生代平均進入老年代大小,提前觸發FullGC。