一、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 | |
VM标記 | jhsdb jinfo --flags | jcmd pid VM.flags | jinfo -flags pid |
二、監控工具
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檔案)。
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使用