JDK自帶的JVM工具


 

虛擬機工具可以分析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 進行分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章