虛擬機工具可以分析jvm運行時數據、定位jvm存在的問題。這些工具在jdk的bin目錄下,前面的均只作爲了解,實際只使用最後2個。
jdk自帶jvm工具
jps
查看jvm進程、jvm參數
#查看正在執行的虛擬機進程,和ps -ef|grep java相似,也可以使用ps -ef | grep xxx代替
#會輸出pid,主類顯示全限定類名,如果執行的是jar則顯示jar的路徑
jps -l
#查看jvm參數
jps -v
jstat
查看jvm的運行狀態,主要用於定位jvm性能問題
jstat -gc 16340 500 10 #pid、間隔多少ms輸出、輸出次數
- S0C、S1C:第一個、第二個Survivor區的容量(from、to),S是Survivor、C是Capacity
- S0U、S1U:第一個、第二個Survivor區已使用的容量,U是used
- EC、 EU:Eden區的容量、已用容量
- OC、OU:老年代的容量、已用容量,O是old
- MC、MU:方法區的
- CCSC、CCSU:壓縮的類空間的
- YGC、YGCT:新生代垃圾回收次數、消耗時間,Y是young,GC就是gc,T是time
- FGC、FGCT:老年代的,FGC是Full GC 老年代GC
- GCT:垃圾回收消耗總時間
jinfo
查看jvm參數
#查看pid對應進程的信息,包括操作系統的信息、環境變量、jvm參數
jinfo 16340
#查看pid對應進程的指定jvm參數
jinfo -flag MaxHeapSize 16340
jmap
用於分析堆的情況、生成堆轉儲快照(副本)
#查看堆的使用情況,包括最大|小堆內存、各年代的使用情況
jmap -heap 28180
# 查看所有的類的實例,包括類名、實例個數、每個實例的大小
# 部分類名會簡寫,比如B=>byte,C=>char,I=>int
jmap -histo 28180
# 信息很多,可以使用管道命令分頁查看
jmap -histo 28180 | more
# 生成堆快照文件,文件後綴是.bin,windows路徑用\,linux用/
jmap -dump:format=b,file=D:\mall.bin 28180 #pid
jmap -dump:format=b,file=/usr/local/mall.bin 28180
#jvm參數,發生OOM異常時自動生成dump文件,可用於系統覆盤(恢復)
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\mall\
jstack
用於查看線程快照。線程快照可以定位線程出現長時間停頓的原因,比如線程間死鎖、死循環、請求外部資源導致的長時間等待等
#查看線程快照,包括線程名、線程狀態、執行到那個類的哪一行代碼
jstack -l 28584 #pid
#只檢查線程死鎖
jstack -m 28584 #pid
eg. 線程死鎖時的線程快照:
會列出發生死鎖的線程,死鎖原因、代碼位置
jconsole(GUI)
jvm的關注點有2塊:內存(堆)、線程,jconsole集成了線程與內存的可視化實時展示,可以連接本地、遠程,可以展示各年代的情況,可以檢測線程死鎖,十分強大
jconsole
VisualVM(GUI)
jconsole很強大,但還是要到命令行去敲命令 ,jvisualvm也是jdk自帶的,常搭配IDEA插件使用,和jconsole一樣強大,但不需要到命令行敲命令,直接在IDEA中使用。
1、IDEA安裝插件 VisualVM Launcher
2、在VisualVM Launcher中配置VisualVM的路徑,即jdk/bin目錄下的 jvisualvm
內存泄漏
- 堆內存泄漏,常見現象:heap使用量明顯上升、經常達到最大堆內存,出現OOM或頻繁Full GC。解決方案:dump分析堆快照
- 堆外內存泄漏:heap使用量很低、無明顯變化,但出現OOM會頻繁Full GC。解決方案:VisualVM -> 工具 -> 插件 -> 可用插件 -> 安裝Btrace 進行分析