天天看點

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
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使用

繼續閱讀