10 個非常重要的 HotSpot JVM 參數

原博客地址:http://www.oschina.net/translate/hotspot-jvm-options-java-examples?cmp


Sun的JDK包含了很多可以參數而且實際上你也不可能瞭解每一個JVM參數,從我的經驗來看,除了那些和堆大小,打印GC信息和遠程調試相關的參數以外,其他的參數你可能基本上都用不到。 即使這樣,有一些有用的參數你至少需要了解一下。在這篇文章裏,我們將會看到10個我覺得有用並且使更常用的JVM參數的例子。我也建議你從官方的文檔裏去獲取 關於JVM參數更全面的資料。


JVM parameters in Java

我們根據JVM參數以-X開頭或-XX開頭將JVM參數分成兩個部分:

1) 以-X開頭的都是非標準的(這些參數並不能保證在所有的JVM上都被實現),而且如果在新版本有什麼改動也不會發布通知。

2)以-XX開頭的都是不穩定的並且不推薦在生產環境中使用。這些參數的改動也不會發布通知。

當寫完 Java Heap Size 和 Java Garbage Collection 兩篇文章的時候我就開始考慮寫一片關於JVM參數的文章了,因爲這兩篇文章是關於JVM參數中主要的兩個部分。 但是等我寫了另一篇關於OutOfMemeoryError的文章 JVM option to solve OutOfMemoryError in Java 後仍然沒有開始寫……。現在我很開心終於把這篇文章寫完並且可以發佈了。像往常一樣,我期待你們的反饋,建議以及其他我遺漏的但是你們認爲有用的JVM參數


對響應時間要求很高的系統來說,良好掌握JVM關於GC調優的參數是很重要的。比如一個高流量地延遲的電子交易平臺,他要求的響應時間都是毫秒級的。要獲得適合的參數組合需要大量的分析和不斷的嘗試,更依賴於交易系統的特性。

關於JVM選項的幾點:

1) 布爾型參數選項:-XX:+ 打開, -XX:- 關閉。(譯者注:比如-XX:+PrintGCDetails)

2) 數字型參數選項通過-XX:=設定。數字可以是 m/M(兆字節),k/K(千字節),g/G(G字節)。比如:32K表示32768字節。(譯者注:比如-XX:HeapDumpPath=./java_pid.hprof)

3) 字符行參數選項通過-XX:=設定,通常用來指定一個文件,路徑,或者一個命令列表。(譯者注:比如-XX:+PrintGCDetails)

命令 java -help可以列出java 應用啓動時標準選項(不同的JVM實現是不同的)。java -X可以列出不標準的參數(這是JVM的擴展特性)。-X相關的選項不是標準的,被改變也不會通知。如果你想查看當前應用使用的JVM參數,你可以使用:ManagementFactory.getRuntimeMXBean().getInputArguments()。

下面就是一些我經常用到的JVM參數列表。


1) 跟 Java 堆大小相關的 JVM 內存參數

下面三個 JVM 參數用來指定堆的初始大小和最大值以及堆棧大小

  -Xms        設置 Java 堆的初始化大小
 -Xmx       設置最大的 Java 堆大小
 -Xss        設置Java線程堆棧大小

2) 關於打印垃圾收集器詳情的 JVM 參數

-verbose:gc 記錄 GC 運行以及運行時間,一般用來查看 GC 是否是應用的瓶頸

-XX:+PrintGCDetails 記錄 GC 運行時的詳細數據信息,包括新生成對象的佔用內存大小以及耗費時間等

-XX:-PrintGCTimeStamps  打印垃圾收集的時間戳



3) 設置 Java 垃圾收集器行爲的 JVM 參數

-XX:+UseParallelGC      使用並行垃圾收集

-XX:-UseConcMarkSweepGC 使用併發標誌掃描收集 (Introduced in 1.4.1)

-XX:-UseSerialGC        使用串行垃圾收集 (Introduced in 5.0.)

需要提醒的是,但你的應用是非常關鍵的、交易非常頻繁應用時,應該謹慎使用 GC 參數,因爲 GC 操作是耗時的,你需要在這之中找到平衡點。 

4)JVM調試參數,用於遠程調試

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

關於遠程調試請閱讀 How to Setup Java remote debugging in Eclipse and 10 Java debugging tips in Eclipse 

5) 關於性能診斷的 JVM 參數

-Xprof

-Xrunhprof


6) 關於類路徑方面的 JVM 參數

Xbootclasspath用來指定你需要加載,但不想通過校驗的類路徑。JVM 會對所有的類在加載前進行校驗併爲每個類通過一個int數值來應用。這個是保證 JVM 穩定的必要過程,但比較耗時,如果你希望跳過這個過程,就把你的類通過這個參數來指定。


7) 用於修改 Perm Gen 大小的 JVM 參數

下面的這三個參數主要用來解決 JVM 錯誤: java.lang.OutOfMemoryError:Perm Gen Space.

-XX:PermSize and MaxPermSize
-XX:NewRatio=2  Ratio of new/old generation sizes.
-XX:MaxPermSize=64m     Size of the Permanent Generation.

8) 用來跟蹤類加載和卸載的信息

-XX:+TraceClassLoading和 -XX:+TraceClassUnloading 用來打印類被加載和卸載的過程信息,這個用來診斷應用的內存泄漏問題非常有用。

9) JVM switches related to logging

-XX:+TraceClassLoading and -XX:+TraceClassUnloading print information class loads and unloads. Useful for investigating if you have a class leak or if old classes (like JITed Ruby methods in JRuby) are getting collected or not.You can read more about logging in Java on my post 10 Tips while logging in Java


-XX:+PrintCompilationprints out the name of each Java method Hotspot decides to JIT compile. The list will usually show a bunch of core Java class methods initially, and then turn to methods in your application. In JRuby, it eventually starts to show Ruby methods as well

10)用於調試目的的 JVM 開關參數

-XX:HeapDumpPath=./java_pid.hprof  Path to directory or file name for heap dump.

-XX:-PrintConcurrentLocks       Print java.util.concurrent locks in Ctrl-Break thread dump.

-XX:-PrintCommandLineFlags   Print flags that appeared on the command line.


發佈了55 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章