本篇文章基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供給了兩個新的參數,在JVM啟動后,在命令行中可以輸出所有XX參數和值。
讓我們現在就了解一下新參數的輸出。以 -client 作為參數的 -XX:+
PrintFlagsFinal
的結果是一個按字母排序的590個參數表格(注意,每個release版本參數的數量會不一樣)(校對注:你可以嘗試在命令行輸入上面的命令,親自實現下)
表格的每一行包括五列,來表示一個XX參數。第一列表示參數的數據類型,第二列是名稱,第四列為值,第五列是參數的類別。第三列”=”表示第四列是參數的默認值,而”:=” 表明了參數被用戶或者JVM賦值了。
注意對于這個例子我只是用了Benchmark類,因為這個系列前面的章節也是用的這個類。甚至沒有一個主類的情況下你能得到相同的輸出,通過運行Java 帶另外的參數 -version.現在讓我們檢查下 server VM提供了多少個參數。我們也能指定參數-XX:+UnlockExperimentalVMOptions
和-XX:+UnlockDiagnosticVMOptions ;來解鎖任何額外的隱藏參數。
(校對注:這個命令非常有用)我們僅設置一個自己的參數 -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 程序的時候設置 -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應用時的參數
這個命令會打出你啟動Java應用時傳給java命令的所有參數,你可以看到里面的JVM參數。
2.直接看啟動腳本,或者參數配置
你未必能找到所有設置這JVM參數的地方,容易遺漏。
一般來講以上兩種辦法都需要對JVM了如指掌或者非常熟悉,至少對特定的參數。
其實JVM中有一個參數-XX:+PrintFlagsFinal,可以打印出幾乎所有的JVM支持的參數以及他們的默認值。如果你想要查看你的Java應用到底使用了那些參數,只要在啟動的時候加上這個參數就可以了。
1.查看你使用的JDK支持的參數
2.打印Java應用啟用的JVM參數
3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1垃圾回收器,在JDK7update3中不論是客戶端(-client)還是服務器(-server)模式下都不是默認啟動的。
jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。
3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1垃圾回收器,在JDK7update3中不論是客戶端(-client)還是服務器(-server)模式下都不是默認啟動的。
jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。
JDK中實用的工具還很多,可以逐個的體驗一下${JAVA_HOME}/bin目錄中的每個命令,有驚喜。- 頂
- 0