[JVM] 如何通过jcmd画火焰图
火焰图是我们日常的比较好用的一个性能分析工具,通过火焰图我们可以分析进程在哪些方法耗时较长,通过分析热点代码调用,找出可以优化的性能瓶颈
jcmd能做什么
在JDK 1.7的版本之后,新增了一个JVM相关的诊断工具jcmd,它可以用来进行JVM堆、线程信息的导出,进行采样分析,这里只简单的介绍它的功能,具体深入的使用方式可以查看文档
如何使用,执行jcmd -h
PerfCounter.print display the counters exposed by this process
-f read and execute commands from the file
-l list JVM processes on the local machine
-h this help
查看本机的JVM进程jcmd -l
54769 org.apache.hadoop.hdfs.server.datanode.DataNode
54870 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
54665 org.apache.hadoop.hdfs.server.namenode.NameNode
54987 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
55325 sun.tools.jcmd.JCmd -l
55070 org.apache.hadoop.yarn.server.nodemanager.NodeManager
查看制定进程的性能统计jcmd 54665 PerfCounter.print
54665:
java.ci.totalTime=4754838518
java.cls.loadedClasses=4867
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=0
...
列出当前进行可以执行的操作jcmd 54665 help
54665:
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
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help
查看对应的命令怎么使用jcmd 54665 help VM.unlock_commercial_features
54665:
VM.unlock_commercial_features
Unlock commercial features
Impact: Low: No impact
Permission: java.lang.management.ManagementPermission(control)
Syntax: VM.unlock_commercial_features
对线程进行dump操作jcmd 54665 Thread.print
54665:
2020-06-03 20:45:23
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
"Attach Listener" #49 daemon prio=9 os_prio=31 tid=0x00007f9b5673b000 nid=0xa50b waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"CacheReplicationMonitor(1004132509)" #48 prio=5 os_prio=31 tid=0x00007f9b58b7d800 nid=0x8d03 waiting on condition [0x000070000a0de000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
...
如何通过jcmd画火焰图
通过上面的简单的jcmd的介绍,我们已经可以简单的使用jcmd了,那么我们如何通过jcmd工具去生成我们想要分析进程的火焰图呢?
第一步解锁jdk的商业特性
jcmd pid VM.unlock_commercial_features
启动JFR(Java Flight Recorder),收集300s的JVM信息,得到output.jfr文件
jcmd pid JFR.start name=test duration=300s settings=profile.jfc filename=output.jfr
下载FlameGraph项目
git clone https://github.com/brendangregg/FlameGraph.git
下载jfr-flame-graph项目进行构建
git clone https://github.com/chrishantha/jfr-flame-graph.git
生成火焰图
export FLAMEGRAPH_DIR=~/FlameGraph
cd ~/jfr-flame-graph/build/install/jfr-flame-graph/bin
./create_flamegraph.sh -f ~/output.jfr -i > ~/flamegraph.svg
然后用浏览器打开,就可以点击对应的调用栈了
除此之外,其实也有软件Java Mission Control可以直接打开output.jfr文件,例如
点击代码,调用树,进行对应的分析
参考文章
-
JVM性能调优工具之jcmd
-
GC日志分析网站:gceasy.io