天天看點

2. JVM基礎-虛拟機基本配置參數

在虛拟機運作的過程中,如果可以跟蹤系統的運作狀态,那麼對于問題的鼓掌排查會有一定的幫助。是以,虛拟機提供了一些跟蹤系統狀态的參數,使用給定的參數執行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

2. JVM基礎-虛拟機基本配置參數

在實際工作中,可以直接講初始化的堆大小與最大堆大小設定相等,這樣的好處是可以減少運作時的垃圾回收次數,進而提高性能。

​新生代的配置​

-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

2. JVM基礎-虛拟機基本配置參數

-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=6 -XX:+PrintGCDetails -XX:+UseSerialGC

2. JVM基礎-虛拟機基本配置參數

-Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

2. JVM基礎-虛拟機基本配置參數

-Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

2. JVM基礎-虛拟機基本配置參數

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

2. JVM基礎-虛拟機基本配置參數