天天看點

JVM實用參數(三)列印所有XX參數及值

本篇文章基于java 6(update 21oder 21之後)版本, hotspot jvm 提供給了兩個新的參數,在jvm啟動後,在指令行中可以輸出所有xx參數和值。

讓我們現在就了解一下新參數的輸出。以 -client 作為參數的 -xx:+<code>printflagsfinal</code>   的結果是一個按字母排序的590個參數表格(注意,每個release版本參數的數量會不一樣)

(校對注:你可以嘗試在指令行輸入上面的指令,親自實作下)

表格的每一行包括五列,來表示一個xx參數。第一清單示參數的資料類型,第二列是名稱,第四列為值,第五列是參數的類别。第三列”=”表示第四列是參數的預設值,而”:=” 表明了參數被使用者或者jvm指派了。

注意對于這個例子我隻是用了benchmark類,因為這個系列前面的章節也是用的這個類。甚至沒有一個主類的情況下你能得到相同的輸出,通過運作java 帶另外的參數 -version.現在讓我們檢查下 server vm提供了多少個參數。我們也能指定參數<code>-xx:+unlockexperimentalvmoptions</code> 和<code>-xx:+unlockdiagnosticvmoptions ;來解鎖任何額外的隐藏參數。</code>

724個參數,讓我們看一眼那些已經被指派的參數。

(校對注:這個指令非常有用)我們僅設定一個自己的參數 -xx:+printflagsfinal。其他參數通過server vm基于系統設定的,以便以合适的堆大小和gc設定運作。

如果我們隻想看下所有xx參數的預設值,能夠用一個相關的參數,-xx:+printflagsinitial  。 用 <code>-xx:+printflagsinitial</code>, 隻是展示了第三列為“=”的資料(也包括那些被設定其他值的參數)。

然而,注意當與-xx:+printflagsfinal 對比的時候,一些參數會丢失,大概因為這些參數是動态建立的。

-xx:+printcommandlineflags

讓我們看下另外一個參數,事實上這個參數非常有用: <code>-xx:+printcommandlineflags</code>。這個參數讓jvm列印出那些已經被使用者或者jvm設定過的詳細的xx參數的名稱和值。

換句話說,它列舉出 <code>-xx:+printflagsfinal的結果中第三列有":="的參數。以這種方式,</code>我們可以用-xx:+printcommandlineflags作為快捷方式來檢視修改過的參數。看下面的例子。

現在如果我們每次啟動java 程式的時候設定 -xx:+printcommandlineflags 并且輸出到日志檔案上,這樣會記錄下我們設定的jvm 參數對應用程式性能的影響。類似于 -showversion(見 part1),我建議 –xx:+printcommandlineflags 這個參數應該總是設定在jvm啟動的配置項裡。因為你從不知道你什麼時候會需要這些資訊。

奇怪的是在這個例子中,通過 <code>-xx:+printcommandlineflags 列出</code>堆的最大值會比通過-xx:+printflagsfinal列舉出的相應值小一點。如果誰知道兩者之間不同的原因,請告訴我。