http://blog.csdn.net/coslay/article/details/43458907
  1. 我們需要知道的是找到默認值的方法,掌握默認值的大概量級,在不同的版本下哪些是常用的默認參數,哪些是必須設置的參數,哪些是可以選擇的、盡量不要去碰的設置。  
  1. 參數設置同一個類型會有多種參數,而且都有默認值,大家不要混用噢,混用的結果很多時候難以預料,雖然在某種情況下可能得到了一個測試結果,但如果你沒有真正了解JVM的內核源碼,是不可能知道所有細節的,即測試結果不能當成任何場景下的一個結論,只能作為一種參考。  

本篇文章基于Java 6update 21oder 21之后)版本, HotSpot JVM 提供給了兩個新的參數,在JVM啟動后,在命令行中可以輸出所有XX參數和值。

  1. -XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial  

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

  1. $ java -client -XX:+PrintFlagsFinal Benchmark  
  2. [Global flags]  
  3. uintx AdaptivePermSizeWeight               = 20               {product}  
  4. uintx AdaptiveSizeDecrementScaleFactor     = 4                {product}  
  5. uintx AdaptiveSizeMajorGCDecayTimeScale    = 10               {product}  
  6. uintx AdaptiveSizePausePolicy              = 0                {product}[...]  
  7. uintx YoungGenerationSizeSupplementDecay   = 8                {product}  
  8. uintx YoungPLABSize                        = 4096             {product}  
  9.  bool ZeroTLAB                             = false            {product}  
  10.  intx hashCode                             = 0                {product}  

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

表格的每一行包括五列,來表示一個XX參數。第一列表示參數的數據類型,第二列是名稱,第四列為值,第五列是參數的類別。第三列”=”表示第四列是參數的默認值,而”:=” 表明了參數被用戶或者JVM賦值了。

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

  1. $ java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal Benchmark  
724個參數,讓我們看一眼那些已經被賦值的參數。
  1. $ java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal Benchmark | grep ":"  
  2. uintx InitialHeapSize                     := 57505088         {product}  
  3. uintx MaxHeapSize                         := 920649728        {product}  
  4. uintx ParallelGCThreads                   := 4                {product}  
  5.  bool PrintFlagsFinal                     := true             {product}  
  6.  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作為快捷方式來查看修改過的參數。看下面的例子。

  1. $ java -server -XX:+PrintCommandLineFlags Benchmark   

  1. -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應用時的參數

  1. ps -ef | grep "your java app name"    

    這個命令會打出你啟動Java應用時傳給java命令的所有參數,你可以看到里面的JVM參數。

    2.直接看啟動腳本,或者參數配置

    你未必能找到所有設置這JVM參數的地方,容易遺漏。

    一般來講以上兩種辦法都需要對JVM了如指掌或者非常熟悉,至少對特定的參數。

    

    其實JVM中有一個參數-XX:+PrintFlagsFinal,可以打印出幾乎所有的JVM支持的參數以及他們的默認值。如果你想要查看你的Java應用到底使用了那些參數,只要在啟動的時候加上這個參數就可以了。

    1.查看你使用的JDK支持的參數

  1. java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version    

    2.打印Java應用啟用的JVM參數

  1. java -XX:+PrintFlagsFinal -classpath=/path/to/your/libs MainClass    

    3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1垃圾回收器,在JDK7update3中不論是客戶端(-client)還是服務器(-server)模式下都不是默認啟動的。

    jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。

  1. jinfo -flag UseParallelOldGC 31072    

    3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1垃圾回收器,在JDK7update3中不論是客戶端(-client)還是服務器(-server)模式下都不是默認啟動的。

    jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。

  1. 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>  
  1. -XX:+UseParallelOldGC    
    JDK中實用的工具還很多,可以逐個的體驗一下${JAVA_HOME}/bin目錄中的每個命令,有驚喜。


參考:http://blog.csdn.net/redhat456/article/details/7360249

0