Loading...

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

posted @ 2020-10-13 17:52  choizzzi  阅读(1784)  评论(0编辑  收藏  举报