JVM實用參數(三)打印所有XX參數及值
本篇文章基於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
。這個參數讓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列舉出的相應值小一點。如果誰知道兩者之間不同的原因,請告訴我。
最後更新:2017-05-24 09:31:49