jcmd:一个可以全部统治的JDK命令行工具
我在過去的幾篇文章中都引用了方便的JDK工具jcmd ,但是像我以前對jps所做的那樣,僅專注于其實用性 。 jcmd工具是隨Oracle Java 7引入的,在通過使用Java標識Java進程的ID (與jps相似),獲取堆轉儲 (與jmap相似),獲取線程轉儲 (與jstack相似)來解決 JVM應用程序 問題方面特別有用。 ),查看虛擬機特征(例如系統屬性和命令行標志)(類似于jinfo ),并獲取垃圾回收統計信息(類似于jstat )。 jcmd工具被稱為“ 用于調查和解決JVM應用程序問題的瑞士軍刀 ”和“ 隱藏的寶石” 。
在使用大多數JDK命令行工具(包括jcmd )時,標識要為其使用命令行工具的Java進程的進程ID(pid)通常很重要。 只需運行不帶任何參數的命令,使用jcmd即可輕松完成此操作,如下一個屏幕快照所示。
在上面的示例中,運行不帶參數的jcmd顯示了兩個正在運行的Java進程( jcmd自身的pid為324,另一個Java進程的pid為7268)。 請注意,盡管在列出Java進程時jcmd工作原理與jps非常相似,但與沒有參數-lm jps相比, jcmd列出的信息更多。
運行jcmd -h用于顯示幫助和用法信息jcmd在下一屏幕快照證明。
如剛剛所示,該幫助說明jcmd在“未給出任何選項”時“列出Java進程”。 幫助還指出,這是類似于運行行為jcmd -p ,但我認為它的意思是說運行jcmd不帶選項相當于跑步jcmd -l ,這是在接下來的屏幕快照所示。
就像在不帶任何選項的情況下運行jcmd , jcmd -l列出了Java進程及其各自的pid。 本例中的pids不同,因為它是jcmd的不同執行, jcmd我運行的Java進程也不同。
運行jcmd -h顯示相對較少的選項。 要查看jcmd支持的許多功能的幫助,需要詢問jcmd特定Java進程支持哪些功能。 下一個屏幕快照對此進行了說明。 我首先運行不帶選項的jcmd來發現感興趣的Java進程的pid(在本例中為6320)。 然后,我可以運行jcmd 6320 help來查看jcmd支持哪些命令。
上一個屏幕快照演示了jcmd支持pid標識的特定Java VM的命令。 具體來說,它指出“以下命令可用:”,然后列出它們:
- JFR停止
- 啟動JFR
- JFR轉儲
- JFR。檢查
- VM.native_memory
- VM.check_commercial_features
- VM.unlock_commercial_features
- 管理代理停止
- ManagementAgent.start_local
- ManagementAgent.start
- GC.rotate_log
- GC.class_stats
- GC.class_histogram
- GC.heap_dump
- GC.run_finalization
- GC運行
- 線程打印
- 虛擬機正常運行時間
- 虛擬機標志
- VM.system_properties
- VM.command_line
- 虛擬機版本
- 幫幫我
當針對另一個Java VM進程的pid運行jcmd <pid> help ,可能會獲得不同的可用命令列表。 下一個屏幕快照中jcmd 1216 help進行了說明,當針對該進程的pid為1216執行jcmd 1216 help時。
通過比較最后兩個屏幕快照,可以清楚地看到jcmd支持針對不同Java VM實例的不同命令。 這就是為什么通過在help命令中指定pid列出特定VM支持的命令的原因。 未針對原始檢查的VM列出的第二個VM可用的一些命令(在這種情況下為pid 1216)包括以下命令:
- VM.log
- 管理代理狀態
- Compiler.directives_clear
- Compiler.directives_remove
- Compiler.directives_add
- Compiler.directives_print
- VM.print_touched_methods
- 編譯器
- 編譯器代碼清單
- 編譯器隊列
- VM.classloader_stats
- JVMTI.data_dump
- VM.stringtable
- 虛擬機
- VM.class_hierarchy
- GC.finalizer_info
- GC.heap_info
- VM.info
- VM.dynlibs
- VM.set_flag
該“幫助”還建議:“有關特定命令的更多信息,請使用'help <command>'。” 在下一個針對jcmd的Thread.print屏幕快照中說明了jcmd 。
在討論jcmd Thread.print命令的主題時,是一個很好的時機來說明如何使用它來查看Java進程的線程堆棧。 下一個屏幕快照顯示了執行jcmd <pid> Thread.print (在本例中為pid 6320的Java進程)時看到的結果要冗長得多的開始。
jcmd支持多個VM.*命令: VM.version , VM.uptime , VM.command_line , VM.flags , VM.system_properties , VM.native_memory和VM.classloader_stats 。 下一個屏幕快照說明了對于使用pid 6320的Java進程使用jcmd <pid> VM.version和jcmd <pid> VM.uptime的情況。
下一個屏幕快照演示了jcmd <pid> VM.command_line使用pid 6320來執行jcmd <pid> VM.command_line 。
從該屏幕快照(其中顯示了運行jcmd 6320 VM.command_line的輸出的頂部)中,我們可以從提供給該進程的JVM命令行參數中看到,它是與NetBeans相關的進程。 使用pid 6320對Java進程運行命令jcmd <pid> VM.flags顯示傳遞給該進程的HotSpot選項。
可以使用jcmd <pid> VM.system_properties列出Java進程使用的系統屬性,這將在下一個屏幕快照中進行說明。
當嘗試對尚未啟用本機內存跟蹤 (NMT)的Java進程運行jcmd <pid> VM.native_memory ,將顯示錯誤消息“未啟用本機內存跟蹤”,如下一個屏幕快照所示。
要使用命令jcmd <pid> VM.native_memory ,應使用-XX:NativeMemoryTracking=summary或-XX:NativeMemoryTracking=detail選項啟動要測量的JVM(Java進程)。 使用這些選項之一啟動VM后,就可以對該JVM進程執行命令jcmd <pid> VM.native_memory baseline ,然后執行jcmd <pid> VM.native_memory detail.diff 。
jcmd <pid> VM.classloader_stats命令可提供對類加載器的了解。 下一個針對pid 1216的Java進程的屏幕快照中顯示了該快照:
jcmd <pid> VM.class_hierarchy是一個有趣的命令,可打印在目標Java VM進程中加載??的類的層次結構。
jcmd <pid> VM.dynlibs可用于查看動態庫信息。 在針對使用pid 1216的Java進程執行時的下一個屏幕快照中對此進行了演示。
jcmd <pid> VM.info列出了許多有關目標Java VM進程的信息,包括VM摘要以及有關該進程,垃圾收集事件,動態庫,提供給VM的參數以及主機某些特征的信息。機。 在jcmd 1216 VM.info的下一個屏幕快照中演示了此輸出開始的一小部分:
下一個屏幕快照展示了jcmd <pid> VM.stringtable和jcmd <pid> VM.symboltable :
下一個屏幕快照中演示了jcmd <pid> Compiler.directives_print使用。
jcmd支持的幾個命令支持管理和監視垃圾收集。 其中兩個是jcmd <pid> GC.run [類似于System.gc() ]和jcmd <pid> GC.run_finalization [類似于System.runFinalization() ]。 在下一個屏幕快照中將演示其中的兩個。
命令jcmd <pid> GC.class_histogram提供了一種方便的方法來查看對象直方圖 ,如下一個屏幕快照所示。
jcmd可用于通過jcmd <pid> GC.heap_dump <filename>針對正在運行的Java VM生jcmd <pid> GC.heap_dump <filename>轉儲,這將在下一個屏幕快照中進行演示。
現在,可以使用jhat命令來處理jcmd生成的堆轉儲,如以下兩個屏幕快照所示。
有些jcmd命令僅適用于使用-XX:+UnlockDiagnosticVMOptions JVM標志啟動的Java VM。 下一個屏幕快照演示了當我嘗試針對未以-XX:+UnlockDiagnosticVMOptions標志啟動的Java VM運行jcmd <pid> GC.class_stats時發生的情況。
使用-XX:+UnlockDiagnosticVMOptions啟動目標VM時, jcmd <pid> GC.class_stats顯示“ 有關Java類元數據的統計信息 ”。
這篇文章介紹了jcmd提供的一些命令,但沒有涉及與Java Flight Recorder [ JFR ](名稱以JFR.*開頭的命令)相關的功能,以檢查并啟用商業功能( jcmd <pid> VM.check_commercial_features和jcmd <pid> VM.unlock_commercial_features )。
在一個命令行工具中, jcmd匯集了幾個命令行JDK工具的功能。 這篇文章演示了jcmd提供的一些功能。
翻譯自: https://www.javacodegeeks.com/2016/03/jcmd-one-jdk-command-line-tool-rule.html
總結
以上是生活随笔為你收集整理的jcmd:一个可以全部统治的JDK命令行工具的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MySQL中关于JOIN的用法全解
- 下一篇: jsf集成spring_Spring和J
