jcmd的簡單總結

jcmd的簡單總結


背景

自從2019年公司轉向java技術路線.
一直斷斷續續的在學習java相關的技術內容.
但是總感覺學的不是很深入.
這周比較累.也不想在學新東西了. 所以想着再總結一下jcmd相關的內容. 
希望能夠記住相關命令, 不需要在每次都百度

簡要說明

jcmd等命令操作時需要能夠attach到具體的具體的jvm的進程上面
所以建議使用與jvm運行的進程相同的java版本進行信息採集. 
成功的概率更高一些. 
建議可以講運行時的java bin路徑設置到 PATH環境變量中.便於快速進行相關命令操作
類似於:
export PATH=$PATH:/path/to/your/java/bin

展示進程

jcmd
會展示所有在運行的java進程,以及主類的目錄
比如獲取當前服務器的一個進程信息: 
jcmd |grep caf-boot|head -n 1 |awk '{print $1}'

查看幫助

jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` help 

展示結果爲:
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` help 
24567:
The following commands are available:
VM.native_memory
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help <command>'.

部分命令解釋-VM

VM.xxxx
這個參數主要是獲取java虛擬機的部分信息, 就類似於Windows的系統屬性的相關內容. 
獲取的信息是靜態信息. 可以查看系統的部分配置如堆區大小等. 可以對系統有一個簡要的判斷. 
VM.native_memory
需要在啓動腳本中添加部分配置 纔可以進行展示, 之前講述過不在過多描述.
VM.classloader_stats
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'`  VM.classloader_stats
可以通過如下命令檢查查看 類加載器的信息
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` VM.classloader_stats  |awk '{print $7}' |sort |uniq -c |sort -k1h
其他VM相關的命令
VM.uptime  啓動時間
VM.dynlibs 啓動加班的相關jar以及動態鏈接庫等
VM.flags   查看啓動的配置信息. 
VM.system_properties  查看時區,版本,腳本語言字符集等.
VM.command_line  啓動腳本等信息
VM.version       啓動的jdk版本等信息

部分命令解釋-GC

GC.xxx
主要是獲取java進程運行時的垃圾回收的情況. 
可以用於分析環境的異常情況.  
需要注意類似的命令都會展示 安全點, 會STW影響系統的響應.

GC.class_stats
需要開啓部分參數
GC.class_stats command requires -XX:+UnlockDiagnosticVMOptions

GC.class_histogram
直方圖
可以使用如下命令存儲
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'`  GC.class_histogram  > zhaobsh.class_histogram   

GC.heap_info
堆區信息
如果查看經常 99%的老年代和新年代 有可能的問題是:
1. 內存泄露
2. 內存不夠
3. 分配不均
4. 創建大內存對象,沒有直接升級到老年代. 

GC.heap_dump
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'`  GC.heap_dump  /root/zhaobsh202303051941.dump
可以直接抓取dump文件
感覺應該是最簡單的命令了. 
跟jmap 等命令比起來要簡單很多. 
注意如果文件名不帶路徑的話可能會到 jcmd 掛載的進程的workdirectory裏面去形成.

部分命令解釋-thread

Thread.print
可以查看具體堆信息
可以通過
top -Hp `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` -bn 1 裏面的CPU使用與
jcmd `jcmd |grep caf-boot|head -n 1 |awk '{print $1}'` Thread.print 進行對照
發現有異常的堆棧信息.

部分命令解釋-PerfCounter.print

很奇怪的是幫助裏面沒有 
PerfCounter.print
但是這個可以顯示部分性能信息. 並且非常全面詳實
但是裏面我不太瞭解對象的單位信息. 
可以看到 創建的線程數量等信息. 以及最高值等. 

java.threads.daemon=48
java.threads.live=302
java.threads.livePeak=350
java.threads.started=2371
具體的情況需要在學習和研究一下. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章