jcmd的使用


官網文檔:

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

官網介紹:

The jcmd utility is used to send diagnostic(診斷 [ˌdaɪəɡˈnɑːstɪk]) command requests to the JVM, where these requests are useful for controlling Java Flight Recordings, troubleshoot, and diagnose JVM and Java Applications. It must be used on the same machine where the JVM is running, and have the same effective user and group identifiers that were used to launch the JVM.

查看進程中的性能計數器

jcmd <pid> PerfCounter.print

例如:

$ jcmd 30420 PerfCounter.print
30420:
java.ci.totalTime=49998630864
java.cls.loadedClasses=15024
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=152
java.property.java.class.path="ewulian-server.jar"
java.property.java.endorsed.dirs="/usr/local/lib/jdk/oracle/8u261/jre/lib/endorsed"
java.property.java.ext.dirs="/usr/local/lib/jdk/oracle/8u261/jre/lib/ext:/usr/java/packages/lib/ext"
java.property.java.home="/usr/local/lib/jdk/oracle/8u261/jre"
java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
java.property.java.version="1.8.0_261"
......

查看可用的診斷命令

jcmd <pid> help

例如:

$ jcmd 30420 help
30420:
The following commands are available:
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
......

VM.version

命令:jcmd VM.version

作用:打印jvm版本信息

VM.uptime

命令:jcmd VM.uptime

作用:打印jvm已運行的秒數

VM.command_line

命令:jcmd VM.command_line

作用:打印jvm啟動的命令信息,即“java -jar xxx.jar”

VM.dynlibs

命令:jcmd VM.dynlibs

作用:打印jvm已加載了哪些動態庫(dynamic libraries)。這個比較有用,比如可以用這個查看jvm是否使用了glibc庫,glibc庫有一個64M緩存的問題,會導致java進程占用大量內存。

例子:

lenovo@lenovo-ThinkServer-TS80X:/usr/local/iot/ewulian$ jcmd 30420 VM.dynlibs
30420:
Dynamic libraries:
a2400000-e0c00000 rw-p 00000000 00:00 0 
......
# 這里表明jvm加載了glibc庫
7ff745034000-7ff74521b000 r-xp 00000000 fd:02 51383524 /lib/x86_64-linux-gnu/libc-2.27.so
7ff74521b000-7ff74541b000 ---p 001e7000 fd:02 51383524 /lib/x86_64-linux-gnu/libc-2.27.so
7ff74541b000-7ff74541f000 r--p 001e7000 fd:02 51383524 /lib/x86_64-linux-gnu/libc-2.27.so
......

VM.flags

命令:jcmd VM.flags

作用:打印jvm使用了哪些虛擬機參數(VM flag options)

例子:

$ jcmd 30420 VM.flags
30420:
-XX:CICompilerCount=3 -XX:InitialHeapSize=524288000 -XX:MaxHeapSize=1572864000 -XX:MaxNewSize=524288000 -XX:MinHeapDeltaBytes=524288 -XX:NativeMemoryTracking=detail -XX:NewSize=174587904 -XX:OldSize=349700096 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

VM.system_properties

命令:jcmd VM.system_properties

作用:打印jvm使用了哪些系統屬性

VM.classloader_stats

命令:jcmd VM.classloader_stats

作用:打印jvm使用了哪些Classloader

VM.native_memory

命令:jcmd VM.native_memory

作用:打印jvm本地內存的使用情況

該命令有更多選項,語法是:

jcmd <pid> VM.native_memory [options]

選項:(選項的形式是這樣的: ,或者: = )
summary : 顯示內存分配的概況
detail : 顯示沒存分配的詳情
baseline : 建立對比的基准線,使用summary.diff或detail.diff前調用該命令來建立基准線,后面使用summary.diff或detail.diff才能以此基准線做對比
summary.diff : 顯示內存分配的概況,跟基准線作對比
detail.diff : 顯示沒存分配的詳情,跟基准線作對比
shutdown : 關閉Native Memory Tracking,釋放占用的內存
statistics : print tracker statistics for tuning purpose. (BOOLEAN, false)
scale : 內存顯示的單位:KB, MB or GB (STRING, KB)

例子:

$ jcmd 30420 VM.native_memory scale=MB
30420:
Native Memory Tracking:
Total: reserved=3127MB, committed=1634MB
-                 Java Heap (reserved=1500MB, committed=1215MB)
                            (mmap: reserved=1500MB, committed=1215MB) 
 
-                     Class (reserved=1115MB, committed=102MB)
                            (classes #14872)
                            (malloc=7MB #29150) 
                            (mmap: reserved=1108MB, committed=95MB) 
 
-                    Thread (reserved=76MB, committed=76MB)
                            (thread #76)
                            (stack: reserved=75MB, committed=75MB)
 
-                      Code (reserved=254MB, committed=61MB)
                            (malloc=11MB #14653) 
                            (mmap: reserved=244MB, committed=50MB) 
 
-                        GC (reserved=60MB, committed=60MB)
                            (malloc=6MB #357) 
                            (mmap: reserved=55MB, committed=54MB) 
 
-                  Internal (reserved=96MB, committed=96MB)
                            (malloc=96MB #20794) 
 
-                    Symbol (reserved=20MB, committed=20MB)
                            (malloc=17MB #178565) 
                            (arena=3MB #1)
 
-    Native Memory Tracking (reserved=4MB, committed=4MB)
                            (tracking overhead=4MB)

關於 reserved 和 committed 的理解

JFR相關

JFR是 Java Fly Record的意思,是Java平台性能分析和事件采集的框架。JFR是商用的特性所以需要解鎖才能使用。我們可以先檢查一下是否解鎖了。

檢查:

$ jcmd 30420 VM.check_commercial_features
30420:
Commercial Features are locked.

解鎖:

$ jcmd 30420 VM.unlock_commercial_features
30420:
Commercial Features now unlocked.

運行JFR相關命令:

  • JFR.start
  • JFR.stop
  • JFR.check
  • JFR.dump

Thread.print

作用:打印線程信息

GC.heap_dump

作用:生成堆轉存快照,HPROF格式,可以使用Eclipse Memory Analyzer打開分析

GC.heap_info

作用:查看堆信息

例子:

$ jcmd 26590 GC.heap_info
26590:
 PSYoungGen      total 377344K, used 226109K [0x00000000e0c00000, 0x0000000100000000, 0x0000000100000000)
  eden space 356864K, 63% used [0x00000000e0c00000,0x00000000ee8cf440,0x00000000f6880000)
  from space 20480K, 0% used [0x00000000f6880000,0x00000000f6880000,0x00000000f7c80000)
  to   space 22016K, 0% used [0x00000000fea80000,0x00000000fea80000,0x0000000100000000)
 ParOldGen       total 444928K, used 36644K [0x00000000a2400000, 0x00000000bd680000, 0x00000000e0c00000)
  object space 444928K, 8% used [0x00000000a2400000,0x00000000a47c9360,0x00000000bd680000)
 Metaspace       used 67056K, capacity 70446K, committed 70744K, reserved 1112064K
  class space    used 7967K, capacity 8541K, committed 8576K, reserved 1048576K


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM