什么是虛擬機參數配置
在虛擬機運行的過程中,如果可以跟蹤系統的運行狀態,那么對於問題的故障
排查會有一定的幫助,為此,在虛擬機提供了一些跟蹤系統狀態的參數,使用
給定的參數執行Java虛擬機,就可以在系統運行時打印相關日志,用於分析實際
問題。我們進行虛擬機參數配置,其實就是圍繞着堆、棧、方法區、進行配置。
堆的參數配置
-XX:+PrintGC 每次觸發GC的時候打印相關日志
-XX:+UseSerialGC 串行回收
-XX:+PrintGCDetails 更詳細的GC日志
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:SurvivorRatio 用來設置新生代中eden空間和from/to空間的比例.
含以-XX:SurvivorRatio=eden/from=den/to
總結:在實際工作中,我們可以直接將初始的堆大小與最大堆大小相等,
這樣的好處是可以減少程序運行時垃圾回收次數,從而提高效率。
-XX:SurvivorRatio 用來設置新生代中eden空間和from/to空間的比例.
設置最大堆內存
參數: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
publicclass JvmDemo01 {
publicstaticvoid main(String[] args) throws InterruptedException {
byte[] b1 = newbyte[1 * 1024 * 1024];
System.out.println("分配了1m");
jvmInfo();
Thread.sleep(3000);
byte[] b2 = newbyte[4 * 1024 * 1024];
System.out.println("分配了4m");
Thread.sleep(3000);
jvmInfo();
}
/**
* 轉換為m
*
* @param maxMemory
* @return
*/
staticprivate String toM(longmaxMemory) {
floatnum = (float) maxMemory / (1024 * 1024);
DecimalFormat df = new DecimalFormat("0.00");// 格式化小數
String s = df.format(num);// 返回的是String類型
returns;
}
staticprivatevoid jvmInfo() {
// 最大內存
longmaxMemory = Runtime.getRuntime().maxMemory();
System.out.println("maxMemory:" + maxMemory + ",轉換為M:" + toM(maxMemory));
// 當前空閑內存
longfreeMemory = Runtime.getRuntime().freeMemory();
System.out.println("freeMemory:" +freeMemory+",轉換為M:"+toM(freeMemory));
// 已經使用內存
longtotalMemory = Runtime.getRuntime().totalMemory();
System.out.println("totalMemory:" +totalMemory+",轉換為M"+toM(totalMemory));
}
}
設置新生代與老年代優化參數
-Xmn 新生代大小,一般設為整個堆的1/3到1/4左右
-XX:SurvivorRatio 設置新生代中eden區和from/to空間的比例關系n/1
設置新生代比例參數
參數: -Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
publicclass JvmDemo02 {
publicstaticvoid main(String[] args) {
//-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
byte [] b = null;
for (inti = 0; i < 10; i++) {
b =newbyte[1*1024*1024];
}
}
}
設置新生與老年代代參數
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:NewRatio=2(比例為1/2)
總結:不同的堆分布情況,對系統執行會產生一定的影響,在實際工作中,
應該根據系統的特點做出合理的配置,基本策略:盡可能將對象預留在新生代,
減少老年代的GC次數。
除了可以設置新生代的絕對大小(-Xmn),可以使用(-XX:NewRatio)設置新生代和老年
代的比例:-XX:NewRatio=老年代/新生代