JVM 模擬Full GC

本篇文章主要是模擬JVM發生Full GC的情況。

github

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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章