JVM實用參數(三)打印全部XX參數及值

JVM實用參數(三)打印全部XX參數及值

原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-3-printing-all-xx-flags-and-their-values/html

譯者李洪柱     校對:方騰飛java

本篇文章基於Java 6(update 21oder 21以後)版本, HotSpot JVM 提供給了兩個新的參數,在JVM啓動後,在命令行中能夠輸出全部XX參數和值。編程

-XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial

讓咱們如今就瞭解一下新參數的輸出。以 -client 做爲參數的 -XX:+PrintFlagsFinal   的結果是一個按字母排序的590個參數表格(注意,每一個release版本參數的數量會不同)redux

 
 
$ 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賦值了。jvm

注意對於這個例子我只是用了Benchmark類,由於這個系列前面的章節也是用的這個類。甚至沒有一個主類的狀況下你能獲得相同的輸出,經過運行java 帶另外的參數 -version.如今讓咱們檢查下 server VM提供了多少個參數。咱們也能指定參數-XX:+UnlockExperimentalVMOptions 和-XX:+UnlockDiagnosticVMOptions ;來解鎖任何額外的隱藏參數。post

$ 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設置運行。ui

若是咱們只想看下全部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列舉出的相應值小一點。若是誰知道二者之間不一樣的緣由,請告訴我。

原創文章,轉載請註明: 轉載自併發編程網 – ifeve.com本文連接地址: JVM實用參數(三)打印全部XX參數及值

相關文章
相關標籤/搜索