在虛拟機運作的過程中,如果可以跟蹤系統的運作狀态,那麼對于問題的鼓掌排查會有一定的幫助。是以,虛拟機提供了一些跟蹤系統狀态的參數,使用給定的參數執行java虛拟機,就可以在系統運作時列印相關日志,用于分析實際問題。虛拟機參數配置,其實主要圍繞着堆、棧、方法區進行配置。
2.1 堆配置設定參數
- -XX:+PrintGC 使用這個參數,虛拟機啟動後,隻要遇到GC就會列印日志。
- -XX:+UseSerialGC 配置串行回收器
- -XX:+PrintGCDetails 可以檢視詳細資訊,包括各個區的情況
- -Xms 設定java程式啟動時初始堆大小
- -Xmx 設定java程式能獲得的最大堆大小
- -XX:+PrintCommandLineFlags 可以将隐式或者顯式傳給虛拟機的參數輸出
//檢視GC資訊
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
byte[] b1 = new byte[1*1024*1024];
System.out.println("配置設定了1M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
byte[] b2 = new byte[4*1024*1024];
System.out.println("配置設定了4M");
System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
運作參數: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
在實際工作中,可以直接講初始化的堆大小與最大堆大小設定相等,這樣的好處是可以減少運作時的垃圾回收次數,進而提高性能。
新生代的配置
-Xmn:可以設定新生代的大小,設定一個比較大的新生代會減少老年代的大小,這個參數堆系統的性能以及GC行為有較大的影響,新生代大小一般會設定整個堆空間的的1/3到1/4左右。
-XX:SurvivorRatio 用來設定新生代中eden空間和from/to空間的比例。(-XX:SurvivorRatio=eden/from=eden/to)
-XX:NewRatio 用來設定老年代和新生代的比例。(-XX:NewRatio=老年代/新生代)
byte[] b = null;
//連續向系統申請10MB空間
for(int i = 0 ; i <10; i ++){
b = new byte[1*1024*1024];
}
根據不同的參數運作:
-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=6 -XX:+PrintGCDetails -XX:+UseSerialGC
-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
2.2 對溢出處理
在java程式運作過程中,如果堆空間不足,則會抛出記憶體溢出錯誤(Out of Menory),一旦這類問題發生在生産環境,可能引起嚴重的業務中斷,java虛拟機提供了 -XX:+HeapDumpOnOutOfMemoryError,使用該參數可以在記憶體溢出時導出整個堆資訊,與之配合使用的參數有 -XX:HeapDumpPath ,可以設定導出堆的存放路徑。
Vector v = new Vector();
for(int i=0; i < 5; i ++){
v.add(new Byte[1*1024*1024]);
}
-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump
D盤生成 Test03.dump 檔案,可能用 Memory Analyzer 工具分析。
2.3 棧配置
java虛拟機提供了參數-Xss來指定線程最大的棧空間大小,整個參數也直接指定了函數可調用的最大深度。
//棧調用深度
rivate static int count;
public static void recursion(){
count++;
recursion();
}
public static void main(String[] args){
try {
recursion();
} catch (Throwable t) {
System.out.println("調用最大深入:" + count);
t.printStackTrace();
}
}
-Xss1m