JVM性能调优工具
一、JDK内置工具对比
|
功能
|
JHSDB
|
JCMD
|
其他工具
|
visualVM
|
|
Java进程
|
N/A
|
jcmd
|
jps -lm
|
界面:overview
|
|
堆Dump
|
jhsdb jmap --binaryheap
|
jcmd pid GC.heap_dump
|
jmap -dump pid
|
按钮:heap dump
|
|
堆直方图
|
jhsdb jmap --histo
|
jcmd pid GC.class_histogram
|
jmap -histo pid
|
按钮:heap histogram
|
|
线程Dump
|
jhsdb jstack --locks
|
jcmd pid Thread.print
|
jstack pid
|
按钮:thread dump
|
|
系统属性
|
jhsdb jinfo --sysprops
|
jcmd pid VM.system_properties
|
jinfo -sysprops pid
|
界面:overview
|
|
VM标记
|
jhsdb jinfo --flags
|
jcmd pid VM.flags
|
jinfo -flags pid
|
界面:overview
|
二、监控工具
1.jps
jps全称Java Virtual Machine Process Status Tool,用来查看JVM进程状态。
2.jstat
jstat全称JVM Statistics Monitoring Tool,用于监控JVM的各种运行状态。
三、故障排查工具
1.jinfo
jinfo全称Java Configuration Info,主要用来查看与调整JVM参数。
2.jmap
jmap全称Java Memory Map,用来展示对象内存映射或堆内存详细信息。
命令格式:
jmap -dump:live,format=b,file=heap.bin <pid>
jmap -heap <pid>
dump文件命令示例:
jmap -dump:file=xxx.dump 39888
jmap -dump:live,format=b,file=xxx.hprof 39888
jmap -heap 39888
3.jstack
jstack,全称Stack Trace for Java,用于打印当前虚拟机的线程快照(线程快照也叫Thread Dump或者javacore文件)。
命令示例:
jstack 进程ID >1.txt
4.jcmd
jcmd全称JVM Command,用于将诊断命令请求发送到正在运行的Java虚拟机,从JDK 7开始提供。
5.jhat
jhat(JVM Heap Analysis Tool)用来分析jmap生成的堆Dump。
jhat功能不是很强,VisualVM、Eclipse Memory Analyzer等都比jhat强大。
6.jhsdb
Jhsdb全称Java Hotspot Debugger,Hotspot进程调试器,可用于从崩溃的JVM附加到Java进程或核心转储。是一款基于Serviceability Agent(可维护性代理,简写为SA)的调试工具。Serviceability Agent是一个JDK组件,用于快照调试、性能分析以及深入了解Hotspot JVM上执行的Java应用程序。
JDK 8及更低版本不直接提供jhsdb命令,但只需找到目录下的sa-jdi.jar文件,然后启动即可。步骤如下:
# 修改环境变量JAVA_HOME(这里用export临时修改环境变量,当然也可永久修改) export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home" # 为sa-jdi.jar授予执行权限 sudo chmod +x $JAVA_HOME/lib/sa-jdi.jar # 启动方式1:使用交互式命令行调试器(相当于jhsdb clhsdb) java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB # 启动方式2:使用交互式GUI调试器启动jhsdb(相当于jhsdb hsdb) java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
jhsdb的GUI模式:jhsdb hsdb子命令。
启动命令:jhsdb hsdb [--pid pid | --exe executable --core coredump]
四、可视化工具
1.jconsole
JConsole(Java Monitoring and Management Console)是一款基于JMX(Java Manage-ment Extensions)的可视化监控、管理工具。它主要通过JMX的MBean(Managed Bean)对系统进行信息收集和参数动态调整。JMX是一种开放性的技术,它既可以用在虚拟机本身的管理上,也可以用于运行在虚拟机之上的软件中。目前很多软件都支持基于JMX进行管理与监控。
启动方式:执行命令jconsole
2.visualVM
VisualVM是一个All-in-One Java Troubleshooting Tool,从JDK 6开始提供,是个强大的监控及故障处理程序之一。
对于JDK 8及更低版本,JDK内置了VisualVM。只需执行jvisualvm命令即可启动,对于JDK 9及更高版本,需要独立下载的VisualVM,github:https://github.com/oracle/visualvm
分析堆Dump文件
File -Load - 选择hprof - 打开 - 分析
注意:
profier对性能影响很大,不要在生产中执行,另外需要禁止类共享 -Xshare:off
3.JMC
JDK Mission Control也叫Java Mission Control,简称JMC。作为JMX控制台,监控虚拟机MBean提供的数据,可持续收集数据的JFR(Java Flight Recorder),并可作为JFR的可视化分析工具.
启动方式:执行命令jmc
4.MAT
Memory Analyzer Tool,简称MAT。是第三方工具(非JDK内置),他是一个快速且功能丰富的Java堆内存分析器。
主要用于:
- 找出内存泄漏的原因
- 找出重复引用的类和Jar
- 分析集合的使用
- 分析类加载器
Leak Suspects:快速查看泄露的可疑点
Histogram:列出内存中每个对象的名字、数量以及大小
Dominator Tree:将所有内存中的对象按大小进行排序,并且我们可以分析对象之间的引用结构
Retained Heap:表示这个对象以及它所持有的其它引用(包括直接和间接)所占的总内存,简单的理解就是,如果这个对象被删除了(GC回收掉),能节省出多少内存。
Shallow Heap :表示一个对象消费的内存的总量,简单的理解就是对象实际占用的堆大小。比如对象的每个引用变量会占用 32 或 64bit(取决于操作系统),每个 Integer 需要占用 4byte,每个 Long 需要占用 8byte,诸如此类
5.JITWatch
JITWatch是JIT编译器的日志分析器与可视化工具,用来检查内联决策、热点方法、字节码以及汇编的各种细节,汇编细节需要配合HSDIS使用

浙公网安备 33010602011771号