1. JDK監(jiān)控和故障處理工具
在JDK的bin目錄下永票,有很多命令行工具。
名稱 | 主要作用 |
---|---|
jps | JVM Process Status Tool肖抱,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程 |
jstat | JVM Statistics Monitoring Tool备典,用于收集HotSpot虛擬機(jī)各方面的運行數(shù)據(jù) |
jinfo | Configuration Info for Java,顯示虛擬機(jī)配置信息 |
jmap | Memory Map for Java意述,生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲快照(heapdump文件) |
jhat | JVM Heap Dump Browser,用于分析heapdump文件吮蛹,用戶可在瀏覽器上查看 |
jstack | Stack Trace for Java荤崇,顯示虛擬機(jī)的線程快照 |
-
jps:虛擬機(jī)進(jìn)程狀況工具
列出正在運行的虛擬機(jī)進(jìn)程,并顯示虛擬機(jī)執(zhí)行主類(main()函數(shù)所在的類)
jps [ options ] [ hostid ]
選項 | 作用 |
---|---|
-q | 只輸出LVMID潮针,省略主類的名稱 |
-m | 輸出虛擬機(jī)進(jìn)程啟動時傳遞給主類main()函數(shù)的參數(shù) |
-l | 輸出主類的全名术荤,如果進(jìn)程執(zhí)行的是jar包,則輸出jar路徑 |
-v | 輸出虛擬機(jī)進(jìn)程啟動時JVM參數(shù) |
-
jstat:虛擬機(jī)統(tǒng)計信息監(jiān)視工具
顯示本地或遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載每篷、內(nèi)存瓣戚、垃圾收集、JIT編譯等運行數(shù)據(jù)焦读。
jstat [ option vmid [interval[s|ms] [count]] ]
選項 | 作用 |
---|---|
-class | 監(jiān)視類裝載子库、卸載數(shù)量、總空間以及類裝載所耗費時間 |
-gc | 監(jiān)視Java堆狀況矗晃,包括Eden仑嗅、Survivor、Old张症、Permanent等容量仓技、GC信息 |
-gccapacity | 與-gc基本相同,主要關(guān)注Java堆各區(qū)域使用的最大俗他、最小空間 |
-gcutil | 與-gc基本相同脖捻,主要關(guān)注已使用空間占總空間的百分比 |
-gccause | 與-gcutil基本相同,會輸出導(dǎo)致上一次GC的原因 |
-gcnew | 監(jiān)視新生代GC狀況 |
-gcnewcapacity | 與-gcnew基本相同兆衅,主要關(guān)注使用的最大地沮、最小空間 |
-gcold | 監(jiān)視老年代GC狀況 |
-gcoldcapacity | 與-gcold基本相同嗜浮,主要關(guān)注使用的最大、最小空間 |
-gcpermcapacity | 永久代使用的最大诉濒、最小空間 |
-compiler | 輸出JIT編譯器編譯過的方法周伦、耗時等信息 |
-printcompilation | 輸出已經(jīng)被JIT編譯的方法 |
-
jinfo:Java配置信息工具
實時查看和調(diào)整虛擬機(jī)各項參數(shù)。
jinfo [ options] pid
選項 | 作用 |
---|---|
-flag | 查看虛擬機(jī)各項參數(shù)(包括默認(rèn)參數(shù)值) |
-sysprops | 打印虛擬機(jī)進(jìn)程的System.getProperties()的內(nèi)容 |
-
jmap:Java內(nèi)存映像工具
用于生成堆轉(zhuǎn)儲快照未荒。
jmap [ options ] vmid
選項 | 作用 |
---|---|
-dump | 生成Java堆轉(zhuǎn)儲快照 |
-finalizerinfo | 顯示在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對象 |
-heap | 顯示Java堆詳細(xì)信息专挪,如使用哪種回收器、參數(shù)配置片排、分代狀況等 |
-histo | 顯示堆中對象統(tǒng)計信息寨腔,包括類、實例數(shù)量率寡、合計容量 |
-permstat | 以ClassLoader為統(tǒng)計口徑顯示永久代內(nèi)存狀態(tài) |
-F | 當(dāng)虛擬機(jī)進(jìn)程對-dump選項沒有響應(yīng)時迫卢,強制生成dump快照 |
-
jhat:虛擬機(jī)堆轉(zhuǎn)儲快照分析工具
與jmap搭配使用,用于分析dump文件冶共。
一般不用此工具乾蛤。
-
jstack:Java堆棧跟蹤工具
用于生成虛擬機(jī)當(dāng)前時刻的線程快照,主要用于定位線程出現(xiàn)長時間停頓的原因捅僵。
jstack [ options ] vmid
選項 | 作用 |
---|---|
-F | 當(dāng)正常輸出請求不被響應(yīng)時家卖,強制輸出線程堆棧快照 |
-l | 除堆棧外庙楚,還顯示關(guān)于鎖的信息 |
-m | 如果調(diào)用到本地方法上荡,顯示C/C++的堆棧 |
-
HSDIS:JIT生成代碼反匯編
HSDIS是一個HotSpot虛擬機(jī)JIT編譯代碼的反匯編插件,可下載馒闷。
該插件的作用是讓HotSpot的-XX:+PrintAssembly指令調(diào)用它來把動態(tài)生成的本地代碼還原為匯編代碼輸出酪捡,同時還生成大量注釋。
2. JDK可視化工具
VisualVM是一款可視化虛擬機(jī)故障處理工具纳账。功能有:
- 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置逛薇、環(huán)境信息(jps、jinfo)
- 監(jiān)視應(yīng)用程序的CPU塞祈、GC金刁、堆、方法區(qū)以及線程的信息(jstat议薪、jstack)
- dump以及分析堆轉(zhuǎn)儲快照(jmap尤蛮、jhat)
- 方法級的程序運行性能分析,找出被調(diào)用最多斯议、運行時間最長的方法
- 離線程序快照:收集程序的運行時配置产捞、線程dump、內(nèi)存dump等信息建立一個快照哼御,快照可發(fā)送
3. 內(nèi)存泄露
無用的對象無法被垃圾回收坯临,一直占著內(nèi)存空間焊唬,就會出現(xiàn)內(nèi)存泄露,例如一個長生命周期對象長期持有短生命周期對象看靠,就可能出現(xiàn)內(nèi)存泄露赶促。
內(nèi)存一直泄露,就會導(dǎo)致內(nèi)存溢出挟炬。
JVM設(shè)置:-Xms10m -Xmx10m
public class MemoryLeakBean {
private final byte[] arr = new byte[1024];
}
public class MemoryLeak {
public static void main(String[] args) throws InterruptedException {
Set<MemoryLeakBean> set = new HashSet<>();
while (true) {
MemoryLeakBean bean = new MemoryLeakBean();
set.add(bean);
Thread.sleep(10);
}
}
}
程序運行時出現(xiàn):
從VisualVM中看鸥滨,YGC執(zhí)行了5次,F(xiàn)GC執(zhí)行了4次谤祖,但是FGC后老年代使用內(nèi)存空間并沒有減少婿滓,說明老年代中對象還一直存活,無法被回收粥喜。
從堆dump中看凸主,MemoryLeakBean實例數(shù)為2352個。
從堆dump中看额湘,MemoryLeakBean實例數(shù)為5631個卿吐,該對象被一直創(chuàng)建,且沒有被回收锋华。
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded