jinfo:JAVA進程運行時修改虛擬機參數利器(無需重啟)

f627 9年前發布 | 33K 次閱讀 jinfo Java開發

     注:本文翻譯自JAVA極客上面的一片文章,有些地方直譯,莫介意。

      虛擬機總會有出現問題的時候,并且你深深的知道如果通過配置一些參數使得虛擬機打印一些運行時信息,可以通過這種途徑改善虛擬機的運行狀況。如 XX:+HeapDumpOnOutOfMemoryError和XX:+PrintGCDetails。但是有時候這些參數會丟失,這是件令人頭痛的事情。

       因此,你痛苦的聳了聳肩,殺掉虛擬機進程,修改啟動參數并祈禱之前的糟糕狀況可以在重新啟動之后重現。現在你擁有足夠的證據來查找問題的根源,并改正。前面描述的方式,很顯然需要一次額外的重啟并添加一些調試參數。實際上,不需要重啟虛擬機的方法是有的,這種方法好處是大大的。

      JDK打包工具里面為我們提供了一個很好的小工具。jinfo是一個命令行工具,通過這個工具可以獲取JAVA進程運行時的一些信息,通過使用jinfo 和一些參數,可以動態修改JAVA進程的虛擬機參數,這些參數并不是萬能的,但是在一些場景中是非常有用的。虛擬機的這些參數可以通過下面的命令查看:

     [tomcat@centos86 ~]$ java -XX:+PrintFlagsFinal -version | grep manageable
     intx CMSAbortablePrecleanWaitMillis            = 100             {manageable}         
     intx CMSWaitDuration                           = 2000            {manageable}         
     bool HeapDumpAfterFullGC                       = false           {manageable}         
     bool HeapDumpBeforeFullGC                      = false           {manageable}         
     bool HeapDumpOnOutOfMemoryError                = false           {manageable}         
    ccstr HeapDumpPath                              =                 {manageable}         
     bool PrintClassHistogram                       = false           {manageable}         
     bool PrintClassHistogramAfterFullGC            = false           {manageable}         
     bool PrintClassHistogramBeforeFullGC           = false           {manageable}         
     bool PrintConcurrentLocks                      = false           {manageable}         
     bool PrintGC                                   = false           {manageable}         
     bool PrintGCDateStamps                         = false           {manageable}         
     bool PrintGCDetails                            = false           {manageable}         
     bool PrintGCTimeStamps                         = false           {manageable} 
</div>

     

          我們通過-XX:+PrintFlagsFinal -version參數可以獲取JVM的所有選項,然而manageable才是我們所感興趣的,通過JDK的管理接口(com.sun.management.HotSpotDiagnosticMCBean API)可以動態寫入。非常相似的MBean也可以通過Jconsole查看,對于我來說命令行的方式是非常方便的。 

    下面是一個使用jinfo的例子: 

    我們通過動態打開JVM的GC日志開關例子來演示jinfo如何使用。 

    我們先通過jps來查看當前運行狀態的虛擬機進程:

[tomcat@centos86 ~]$ jps 
10463 Bootstrap 
32588 Bootstrap 
27250 Bootstrap 
    我們通過使用jinfo來打開虛擬機GC日志打印參數,-XX:+PrintGC和-XX:+PrintGCDetails。使用命令行方式微小的差別在于需要為jinfo同時指定-XX:+PrintGC和-XX:+PrintGCDetails參數。除了通過啟動腳本可以設置參數,PrintGC默認是打開的,因此我們只需要打開PrintGCDetails參數。
</div>

jinfo -flag +PrintGC 27250 
jinfo -flag +PrintGCDDetails 27250 

結果是這樣的:
[GC [PSYoungGen: 147073K->16612K(145920K)] 453287K->322827K(495616K), 0.0429920 secs] [Times: user=0.08 sys=0.00, real=0.04 secs]  
[GC [PSYoungGen: 145636K->25582K(150528K)] 451851K->333586K(500224K), 0.0461510 secs] [Times: user=0.11 sys=0.00, real=0.05 secs]  
[GC [PSYoungGen: 150510K->29667K(154624K)] 458514K->351748K(504320K), 0.1074310 secs] [Times: user=0.31 sys=0.00, real=0.11 secs]  
[GC [PSYoungGen: 154595K->14379K(181248K)] 476676K->336851K(530944K), 0.0738610 secs] [Times: user=0.09 sys=0.02, real=0.08 secs]  
[GC [PSYoungGen: 160811K->16390K(183808K)] 483283K->338991K(533504K), 0.0363680 secs] [Times: user=0.10 sys=0.00, real=0.03 secs]  
[GC [PSYoungGen: 162822K->17194K(199680K)] 485423K->339987K(549376K), 0.1190460 secs] [Times: user=0.28 sys=0.10, real=0.12 secs]  
[GC [PSYoungGen: 186666K->15663K(203264K)] 509459K->338613K(552960K), 0.0550360 secs] [Times: user=0.11 sys=0.07, real=0.06 secs]  

</div>

如果需要關閉GC日志的打印,使用下面的命令:

jinfo -flag -PrintGC 27250 
jinfo -flag -PrintGCDDetails 27250
來自

 本文由用戶 f627 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!