- 我們需要知道的是找到默認值的方法,掌握默認值的大概量級,在不同的版本下哪些是常用的默認參數,哪些是必須設置的參數,哪些是可以選擇的、盡量不要去碰的設置。
- 參數設置同一個類型會有多種參數,而且都有默認值,大家不要混用噢,混用的結果很多時候難以預料,雖然在某種情況下可能得到了一個測試結果,但如果你沒有真正了解JVM的內核源碼,是不可能知道所有細節的,即測試結果不能當成任何場景下的一個結論,只能作為一種參考。
本篇文章基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供給了兩個新的參數,在JVM啟動后,在命令行中可以輸出所有XX參數和值。
- -XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial
讓我們現在就了解一下新參數的輸出。以 -client 作為參數的 -XX:+PrintFlagsFinal
的結果是一個按字母排序的590個參數表格(注意,每個release版本參數的數量會不一樣)
- $ java -client -XX:+PrintFlagsFinal Benchmark
- [Global flags]
- uintx AdaptivePermSizeWeight = 20 {product}
- uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
- uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
- uintx AdaptiveSizePausePolicy = 0 {product}[...]
- uintx YoungGenerationSizeSupplementDecay = 8 {product}
- uintx YoungPLABSize = 4096 {product}
- bool ZeroTLAB = false {product}
- intx hashCode = 0 {product}
(校對注:你可以嘗試在命令行輸入上面的命令,親自實現下)
表格的每一行包括五列,來表示一個XX參數。第一列表示參數的數據類型,第二列是名稱,第四列為值,第五列是參數的類別。第三列”=”表示第四列是參數的默認值,而”:=” 表明了參數被用戶或者JVM賦值了。
注意對于這個例子我只是用了Benchmark類,因為這個系列前面的章節也是用的這個類。甚至沒有一個主類的情況下你能得到相同的輸出,通過運行Java 帶另外的參數 -version.現在讓我們檢查下 server VM提供了多少個參數。我們也能指定參數-XX:+UnlockExperimentalVMOptions
和-XX:+UnlockDiagnosticVMOptions ;來解鎖任何額外的隱藏參數。
- $ java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal Benchmark
724個參數,讓我們看一眼那些已經被賦值的參數。- $ java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal Benchmark | grep ":"
- uintx InitialHeapSize := 57505088 {product}
- uintx MaxHeapSize := 920649728 {product}
- uintx ParallelGCThreads := 4 {product}
- bool PrintFlagsFinal := true {product}
- bool UseParallelGC := true {product}
(校對注:這個命令非常有用)我們僅設置一個自己的參數 -XX:+PrintFlagsFinal。其他參數通過server VM基于系統設置的,以便以合適的堆大小和GC設置運行。
如果我們只想看下所有XX參數的默認值,能夠用一個相關的參數,-XX:+PrintFlagsInitial 。 用 -XX:+PrintFlagsInitial
, 只是展示了第三列為“=”的數據(也包括那些被設置其他值的參數)。
然而,注意當與-XX:+PrintFlagsFinal 對比的時候,一些參數會丟失,大概因為這些參數是動態創建的。
研究表格的內容是很有意思的,通過比較client和server VM的行為,很明顯了解哪些參數會影響其他的參數。有興趣的讀者,可以看一下這篇不錯文章Inspecting HotSpot JVM Options。這個文章主要解釋了第五列的參數類別。
-XX:+PrintCommandLineFlags
讓我們看下另外一個參數,事實上這個參數非常有用: -XX:+PrintCommandLineFlags
。這個參數讓JVM打印出那些已經被用戶或者JVM設置過的詳細的XX參數的名稱和值。
換句話說,它列舉出 -XX:+PrintFlagsFinal的結果中第三列有":="的參數。以這種方式,
我們可以用-XX:+PrintCommandLineFlags作為快捷方式來查看修改過的參數。看下面的例子。
- $ java -server -XX:+PrintCommandLineFlags Benchmark
- -XX:InitialHeapSize=57505088 -XX:MaxHeapSize=920081408 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+UseParallelGC
現在如果我們每次啟動java 程序的時候設置 -XX:+PrintCommandLineFlags 并且輸出到日志文件上,這樣會記錄下我們設置的JVM 參數對應用程序性能的影響。類似于 -showversion(見 Part1),我建議 –XX:+PrintCommandLineFlags 這個參數應該總是設置在JVM啟動的配置項里。因為你從不知道你什么時候會需要這些信息。
奇怪的是在這個例子中,通過 -XX:+PrintCommandLineFlags 列出
堆的最大值會比通過-XX:+PrintFlagsFinal列舉出的相應值小一點。如果誰知道兩者之間不同的原因,請告訴我。
轉載自:http://ifeve.com/useful-jvm-flags-part-3-printing-all-xx-flags-and-their-values/
Java程序員有時候需要了解JVM相關的參數,不管是出于好奇或者工作需要。Oracle的文檔中列出了一些,(點擊這里),單并不是全部,而且有些參數的設置會默認啟用或者關閉其他一些參數,而在某些情況下設置某個參數是不會生效的。還有些時候你想讓JVM做某些事情,但是你不知道那個參數可以用。下面介紹一些辦法用以列出所有參數,這樣你在研究或者Google的時候也比較有明確的目標。
如果你想查看一下線上正在運行的JVM到底設置了那些參數,生效的是那些,可能用到的方法:
1. 在Linux下用ps命令找到啟動Java應用時的參數
- ps -ef | grep "your java app name"
這個命令會打出你啟動Java應用時傳給java命令的所有參數,你可以看到里面的JVM參數。
2.直接看啟動腳本,或者參數配置
你未必能找到所有設置這JVM參數的地方,容易遺漏。
一般來講以上兩種辦法都需要對JVM了如指掌或者非常熟悉,至少對特定的參數。
其實JVM中有一個參數-XX:+PrintFlagsFinal,可以打印出幾乎所有的JVM支持的參數以及他們的默認值。如果你想要查看你的Java應用到底使用了那些參數,只要在啟動的時候加上這個參數就可以了。
1.查看你使用的JDK支持的參數
- java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
2.打印Java應用啟用的JVM參數- java -XX:+PrintFlagsFinal -classpath=/path/to/your/libs MainClass
3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1垃圾回收器,在JDK7update3中不論是客戶端(-client)還是服務器(-server)模式下都不是默認啟動的。
jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。
- jinfo -flag UseParallelOldGC 31072
3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1垃圾回收器,在JDK7update3中不論是客戶端(-client)還是服務器(-server)模式下都不是默認啟動的。
jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。
- jinfo -flag UseParallelOldGC 31072 <span style="color: rgb(0, 204, 0); line-height: 18px; font-family: Consolas, 'Courier New', Courier, mono, serif; background-color: inherit;"> </span>
JDK中實用的工具還很多,可以逐個的體驗一下${JAVA_HOME}/bin目錄中的每個命令,有驚喜。
參考:http://blog.csdn.net/redhat456/article/details/7360249