- 3 诊断工具jcmd
- 3.1 简介
- 3.2 jcmd 有用命令
- 3.3 使用 jcmd 进行故障排除
该jcmd实用程序用于向 JVM 发送诊断命令请求,这些请求对于控制 Java 飞行记录、故障排除和诊断 JVM 和 Java 应用程序很有用。
jcmd必须在运行 JVM 的同一台机器上使用,并且具有用于启动 JVM 的相同有效用户和组标识符。
一个特殊的命令
jcmdPerfCounter.print
打印进程中的所有性能计数器。
该命令
jcmd[options]
将命令发送到 JVM。
以下示例是我查看了下本地Zookeeper进程,使用jcmd实用程序对 JVM 的诊断命令请求。
jps -l 45040 link.elastic.algorithm.sort.JavaSort 47139 sun.tools.jps.Jps 43384 15996 Eclipse 17389 org.apache.zookeeper.server.quorum.QuorumPeerMain 45039 org.jetbrains.jps.cmdline.Launcher jcmd 17389 PerfCounter.print 17389: java.ci.totalTime=4081782941 java.cls.loadedClasses=2951 java.cls.sharedLoadedClasses=0 java.cls.sharedUnloadedClasses=0 java.cls.unloadedClasses=0 java.property.java.class.path="/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../zookeeper-server/target/classes:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../build/classes:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../zookeeper-server/target/lib/*.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../build/lib/*.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../lib/slf4j-log4j12-1.7.25.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../lib/slf4j-api-1.7.25.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../lib/netty-3.10.6.Final.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../lib/log4j-1.2.17.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../lib/jline-0.9.94.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../lib/audience-annotations-0.5.0.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../zookeeper-3.4.14.jar:/Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../zookeeper-server/src/main/resources/lib/*" java.property.java.endorsed.dirs="/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/endorsed" java.property.java.ext.dirs="/Users/song/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java" java.property.java.home="/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre" java.property.java.library.path="/Users/song/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:." java.property.java.version="1.8.0_181" java.property.java.vm.info="mixed mode" java.property.java.vm.name="Java HotSpot(TM) 64-Bit Server VM" java.property.java.vm.specification.name="Java Virtual Machine Specification" java.property.java.vm.specification.vendor="Oracle Corporation" java.property.java.vm.specification.version="1.8" java.property.java.vm.vendor="Oracle Corporation" java.property.java.vm.version="25.181-b13" java.rt.vmArgs="-Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false" java.rt.vmFlags="" java.threads.daemon=9 java.threads.live=13 java.threads.livePeak=17 java.threads.started=19 sun.ci.compilerThread.0.compiles=101 sun.ci.compilerThread.0.method="" sun.ci.compilerThread.0.time=150768 sun.ci.compilerThread.0.type=1 sun.ci.compilerThread.1.compiles=123 sun.ci.compilerThread.1.method="" sun.ci.compilerThread.1.time=303703 sun.ci.compilerThread.1.type=1 sun.ci.compilerThread.2.compiles=133 sun.ci.compilerThread.2.method="" sun.ci.compilerThread.2.time=153284 sun.ci.compilerThread.2.type=1 sun.ci.compilerThread.3.compiles=2650 sun.ci.compilerThread.3.method="" sun.ci.compilerThread.3.time=878724 sun.ci.compilerThread.3.type=1 sun.ci.lastFailedMethod="" sun.ci.lastFailedType=0 sun.ci.lastInvalidatedMethod="" sun.ci.lastInvalidatedType=0 sun.ci.lastMethod="java/io/DataOutputStream writeLong" sun.ci.lastSize=538 sun.ci.lastType=1 sun.ci.nmethodCodeSize=4382304 sun.ci.nmethodSize=7432560 sun.ci.osrBytes=8511 sun.ci.osrCompiles=18 sun.ci.osrTime=226662724 sun.ci.standardBytes=351330 sun.ci.standardCompiles=2989 sun.ci.standardTime=3855120217 sun.ci.threads=4 sun.ci.totalBailouts=0 sun.ci.totalCompiles=3007 sun.ci.totalInvalidates=0 sun.classloader.findClassTime=136280873 sun.classloader.findClasses=252 sun.classloader.parentDelegationTime=11216798 sun.cls.appClassBytes=1030022 sun.cls.appClassLoadCount=546 sun.cls.appClassLoadTime=148073656 sun.cls.appClassLoadTime.self=93655404 sun.cls.classInitTime=545103878 sun.cls.classInitTime.self=395164525 sun.cls.classLinkedTime=109150785 sun.cls.classLinkedTime.self=49764063 sun.cls.classVerifyTime=59068645 sun.cls.classVerifyTime.self=23811702 sun.cls.defineAppClassTime=66412129 sun.cls.defineAppClassTime.self=22380276 sun.cls.defineAppClasses=370 sun.cls.initializedClasses=2409 sun.cls.isUnsyncloadClassSet=0 sun.cls.jniDefineClassNoLockCalls=0 sun.cls.jvmDefineClassNoLockCalls=364 sun.cls.jvmFindLoadedClassNoLockCalls=1149 sun.cls.linkedClasses=2753 sun.cls.loadInstanceClassFailRate=0 sun.cls.loadedBytes=5609488 sun.cls.lookupSysClassTime=122026090 sun.cls.methodBytes=2715528 sun.cls.nonSystemLoaderLockContentionRate=0 sun.cls.parseClassTime=318200532 sun.cls.parseClassTime.self=283891147 sun.cls.sharedClassLoadTime=223854 sun.cls.sharedLoadedBytes=0 sun.cls.sharedUnloadedBytes=0 sun.cls.sysClassBytes=8983504 sun.cls.sysClassLoadTime=372229695 sun.cls.systemLoaderLockContentionRate=0 sun.cls.time=1013072046 sun.cls.unloadedBytes=0 sun.cls.unsafeDefineClassCalls=189 sun.cls.verifiedClasses=2753 sun.gc.cause="No GC" sun.gc.collector.0.invocations=1 sun.gc.collector.0.lastEntryTime=141455502165177 sun.gc.collector.0.lastExitTime=141455541705304 sun.gc.collector.0.name="PSScavenge" sun.gc.collector.0.time=39540597 sun.gc.collector.1.invocations=0 sun.gc.collector.1.lastEntryTime=0 sun.gc.collector.1.lastExitTime=0 sun.gc.collector.1.name="PSParallelCompact" sun.gc.collector.1.time=0 sun.gc.compressedclassspace.capacity=2097152 sun.gc.compressedclassspace.maxCapacity=1073741824 sun.gc.compressedclassspace.minCapacity=0 sun.gc.compressedclassspace.used=1958984 sun.gc.generation.0.capacity=89128960 sun.gc.generation.0.maxCapacity=1431306240 sun.gc.generation.0.minCapacity=89128960 sun.gc.generation.0.name="new" sun.gc.generation.0.space.0.capacity=67108864 sun.gc.generation.0.space.0.initCapacity=0 sun.gc.generation.0.space.0.maxCapacity=1430257664 sun.gc.generation.0.space.0.name="eden" sun.gc.generation.0.space.0.used=20431392 sun.gc.generation.0.space.1.capacity=11010048 sun.gc.generation.0.space.1.initCapacity=0 sun.gc.generation.0.space.1.maxCapacity=477102080 sun.gc.generation.0.space.1.name="s0" sun.gc.generation.0.space.1.used=0 sun.gc.generation.0.space.2.capacity=11010048 sun.gc.generation.0.space.2.initCapacity=0 sun.gc.generation.0.space.2.maxCapacity=477102080 sun.gc.generation.0.space.2.name="s1" sun.gc.generation.0.space.2.used=4925704 sun.gc.generation.0.spaces=3 sun.gc.generation.1.capacity=179306496 sun.gc.generation.1.maxCapacity=2863661056 sun.gc.generation.1.minCapacity=179306496 sun.gc.generation.1.name="old" sun.gc.generation.1.space.0.capacity=179306496 sun.gc.generation.1.space.0.initCapacity=179306496 sun.gc.generation.1.space.0.maxCapacity=2863661056 sun.gc.generation.1.space.0.name="old" sun.gc.generation.1.space.0.used=90128 sun.gc.generation.1.spaces=1 sun.gc.lastCause="Allocation Failure" sun.gc.metaspace.capacity=17563648 sun.gc.metaspace.maxCapacity=1090519040 sun.gc.metaspace.minCapacity=0 sun.gc.metaspace.used=16895152 sun.gc.policy.avgBaseFootprint=268435456 sun.gc.policy.avgMajorIntervalTime=0 sun.gc.policy.avgMajorPauseTime=0 sun.gc.policy.avgMinorIntervalTime=141455531 sun.gc.policy.avgMinorPauseTime=39 sun.gc.policy.avgOldLive=0 sun.gc.policy.avgPretenuredPaddedAvg=0 sun.gc.policy.avgPromotedAvg=90128 sun.gc.policy.avgPromotedDev=0 sun.gc.policy.avgPromotedPaddedAvg=90128 sun.gc.policy.avgSurvivedAvg=4925704 sun.gc.policy.avgSurvivedDev=0 sun.gc.policy.avgSurvivedPaddedAvg=4925704 sun.gc.policy.avgYoungLive=4925704 sun.gc.policy.boundaryMoved=0 sun.gc.policy.changeOldGenForMajPauses=0 sun.gc.policy.changeOldGenForMinPauses=0 sun.gc.policy.changeYoungGenForMajPauses=0 sun.gc.policy.changeYoungGenForMinPauses=0 sun.gc.policy.collectors=2 sun.gc.policy.decideAtFullGc=0 sun.gc.policy.decreaseForFootprint=0 sun.gc.policy.decrementTenuringThresholdForGcCost=0 sun.gc.policy.decrementTenuringThresholdForSurvivorLimit=0 sun.gc.policy.desiredSurvivorSize=11010048 sun.gc.policy.edenSize=67108864 sun.gc.policy.freeSpace=134217728 sun.gc.policy.fullFollowsScavenge=0 sun.gc.policy.gcTimeLimitExceeded=0 sun.gc.policy.generations=3 sun.gc.policy.increaseOldGenForThroughput=0 sun.gc.policy.increaseYoungGenForThroughput=0 sun.gc.policy.incrementTenuringThresholdForGcCost=0 sun.gc.policy.liveAtLastFullGc=67108864 sun.gc.policy.liveSpace=273361152 sun.gc.policy.majorCollectionSlope=0 sun.gc.policy.majorGcCost=0 sun.gc.policy.majorPauseOldSlope=0 sun.gc.policy.majorPauseYoungSlope=0 sun.gc.policy.maxTenuringThreshold=15 sun.gc.policy.minorCollectionSlope=0 sun.gc.policy.minorGcCost=0 sun.gc.policy.minorPauseOldSlope=0 sun.gc.policy.minorPauseTime=39 sun.gc.policy.minorPauseYoungSlope=0 sun.gc.policy.mutatorCost=99 sun.gc.policy.name="ParScav:MSC" sun.gc.policy.oldCapacity=179306496 sun.gc.policy.oldEdenSize=67108864 sun.gc.policy.oldPromoSize=67108864 sun.gc.policy.promoSize=67108864 sun.gc.policy.promoted=90128 sun.gc.policy.scavengeSkipped=0 sun.gc.policy.survived=4925704 sun.gc.policy.survivorOverflowed=0 sun.gc.policy.tenuringThreshold=7 sun.gc.policy.youngCapacity=78118912 sun.gc.tlab.alloc=8220828 sun.gc.tlab.allocThreads=17 sun.gc.tlab.fastWaste=753 sun.gc.tlab.fills=49 sun.gc.tlab.gcWaste=2174777 sun.gc.tlab.maxFastWaste=729 sun.gc.tlab.maxFills=14 sun.gc.tlab.maxGcWaste=167768 sun.gc.tlab.maxSlowAlloc=0 sun.gc.tlab.maxSlowWaste=36 sun.gc.tlab.slowAlloc=0 sun.gc.tlab.slowWaste=103 sun.management.JMXConnectorServer.address="service:jmx:rmi://127.0.0.1/stub/rO0ABXN9AAAAAQAlamF2YXgubWFuYWdlbWVudC5yZW1vdGUucm1pLlJNSVNlcnZlcnhyABdqYXZhLmxhbmcucmVmbGVjdC5Qcm94eeEn2iDMEEPLAgABTAABaHQAJUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uSGFuZGxlcjt4cHNyAC1qYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN0SW52b2NhdGlvbkhhbmRsZXIAAAAAAAAAAgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHcyAApVbmljYXN0UmVmAAkxMjcuMC4wLjEAAPXhdHK3QU4uD0yln0gOAAABgIeEI1aAAQB4" sun.os.hrt.frequency=1000000000 sun.os.hrt.ticks=184898221276594 sun.perfdata.majorVersion=2 sun.perfdata.minorVersion=0 sun.perfdata.overflow=0 sun.perfdata.size=32768 sun.perfdata.timestamp=438640868 sun.perfdata.used=19984 sun.property.sun.boot.class.path="/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/classes" sun.property.sun.boot.library.path="/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib" sun.rt._sync_ContendedLockAttempts=66 sun.rt._sync_Deflations=194 sun.rt._sync_EmptyNotifications=0 sun.rt._sync_FailedSpins=0 sun.rt._sync_FutileWakeups=5 sun.rt._sync_Inflations=198 sun.rt._sync_MonExtant=384 sun.rt._sync_MonInCirculation=0 sun.rt._sync_MonScavenged=0 sun.rt._sync_Notifications=109 sun.rt._sync_Parks=159 sun.rt._sync_PrivateA=0 sun.rt._sync_PrivateB=0 sun.rt._sync_SlowEnter=0 sun.rt._sync_SlowExit=0 sun.rt._sync_SlowNotify=0 sun.rt._sync_SlowNotifyAll=0 sun.rt._sync_SuccessfulSpins=0 sun.rt.applicationTime=182545431505024 sun.rt.createVmBeginTime=1651541025459 sun.rt.createVmEndTime=1651541025899 sun.rt.internalVersion="Java HotSpot(TM) 64-Bit Server VM (25.181-b13) for bsd-amd64 JRE (1.8.0_181-b13), built on Jul 7 2018 01:02:31 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)" sun.rt.interruptedBeforeIO=0 sun.rt.interruptedDuringIO=0 sun.rt.javaCommand="org.apache.zookeeper.server.quorum.QuorumPeerMain /Users/song/Desktop/Computer/A/env/zookeeper-3.4.14/bin/../conf/zoo.cfg" sun.rt.jvmCapabilities="1100000000000000000000000000000000000000000000000000000000000000" sun.rt.jvmVersion=431292429 sun.rt.safepointSyncTime=17243640 sun.rt.safepointTime=180462896 sun.rt.safepoints=408 sun.rt.threadInterruptSignaled=0 sun.rt.vmInitDoneTime=1651541025505 sun.threads.vmOperationTime=148657232 sun.urlClassLoader.readClassBytesTime=56031525 sun.zip.zipFile.openTime=9932427 sun.zip.zipFiles=153.2 jcmd 有用命令
HotSpot VM不同版本可用的诊断命令可能不同;因此,使用是查看所有可用选项的最佳方式。 如下操作
jcmdhelp
如下所示:
jcmd 17389 help 17389: The following commands are available: JFR.stop JFR.start JFR.dump JFR.check VM.native_memory VM.check_commercial_features VM.unlock_commercial_features 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'.
以下是该jcmd工具中一些最有用的命令。请记住,您始终可以使用jcmd
打印完整的 HotSpot 和 JDK 版本 ID。
jcmdVM.version
打印为 VM 设置的所有系统属性。
可以显示数百行信息。
jcmdVM.system_properties
打印用于 VM 的所有标志。
即使您没有提供任何标志,也会打印一些默认值,例如初始和最大堆大小。
jcmdVM.flags
以秒为单位打印正常运行时间。
jcmdVM.uptime
创建类直方图。
结果可能相当冗长,因此您可以将输出重定向到文件。内部类和特定于应用程序的类都包含在列表中。占用内存最多的类列在顶部,类按降序排列。
jcmdGC.class_histogram
创建堆转储。
jcmd GC.heap_dump filename=Myheapdump
这与 using 相同jmap -dump:file= ,但jcmd它是推荐使用的工具。
创建堆直方图。
jcmdGC.class_histogram filename=Myheaphistogram
这与 using 相同jmap -histo ,但jcmd它是推荐使用的工具。
打印带有堆栈跟踪的所有线程。
jcmd3.3 使用 jcmd 进行故障排除Thread.print
使用该jcmd实用程序进行故障排除。
该jcmd实用程序提供以下故障排除选项:
开始记录飞行窗口。
例如,要使用标识符在正在运行的 Java 进程上开始 2 分钟的录制7060并将其保存到当前目录中的 myrecording.jfr,请使用以下命令:
jcmd 17389 JFR.start name=MyRecording settings=profile delay=20s duration=2m filename=myrecording.jfr
检查记录飞行窗口。
JFR.check诊断命令检查正在运行的记录。例如:
jcmd 17389 JFR.check
停止记录飞行窗口。
诊断命令会停止正在运行的JFR.stop记录,并且可以选择丢弃记录数据。例如:
jcmd 17389 JFR.stop
转储飞行窗口。
诊断命令会停止正在运行的JFR.dump记录,并且可以选择将记录转储到文件中。例如:
jcmd 17389 JFR.dump name=MyRecording filename=myrecording.jfr
创建堆转储。
创建堆转储的首选方法是
jcmdGC.heap_dump filename=Myheapdump
创建堆直方图。
创建堆直方图的首选方法是
jcmdGC.class_histogram filename=Myheaphistogram


![[Java故障排除指南- JDK11-学习笔记]-3-诊断工具jcmd [Java故障排除指南- JDK11-学习笔记]-3-诊断工具jcmd](http://www.mshxw.com/aiimages/31/862742.png)
