命令行工具
- jps
??jps類似于linux中的ps命令觉义,用于打印正在運(yùn)行的java進(jìn)程相關(guān)的信息悍及。主要參數(shù)有:
1)-l 打印模塊名以及包名
2)-v 打印傳給JVM的參數(shù)
3)-m打印傳給main方法的參數(shù) -
jstat
??用于打印JVM進(jìn)程的性能數(shù)據(jù)刃跛,主要用來查看JVM gc相關(guān)的數(shù)據(jù)。實(shí)際中用法如下圖:
打印的各參數(shù)含義如下:
1:S0C剑肯、S1C、S0U观堂、S1U:Survivor 0/1區(qū)容量(Capacity)和使用量(Used)
2:EC退子、EU:Eden區(qū)容量和使用量
3:OC、OU:年老代容量和使用量
4:MC型将、MU:元數(shù)據(jù)區(qū)容量和使用量
5:CCSC寂祥、CCSU:壓縮類空間容量和使用量
5:YGC、YGT:年輕代GC次數(shù)和GC耗時(shí)
6:FGC七兜、FGCT:Full GC次數(shù)和Full GC耗時(shí)
7:GCT:GC總耗時(shí)
jstat可以用來判斷系統(tǒng)是否出現(xiàn)了內(nèi)存泄漏丸凭,方法是通過一短長時(shí)間的觀察OU的增長情況,如果OU穩(wěn)定增長腕铸,則有可能出現(xiàn)內(nèi)存泄漏惜犀。 -
jmap
1:jmap -heap:用于打印堆內(nèi)存使用情況,包括使用的GC算法涛菠、堆配置參數(shù)和各代中堆內(nèi)存使用莉御,示例如下圖所示:
??jmap用于分析JVM中堆中的對象,包括生成堆的dump文件狠裹,這個(gè)命令同樣有多條子命令虽界。常用的命令有如下幾個(gè):
2:jmap -histo:live:用于打印堆中各個(gè)類中的實(shí)例數(shù)目以及占用內(nèi)存的大小,并排序俗冻。使用的示例如下:
3:jmap -dump :用于導(dǎo)出JVM的堆快照文件礁叔,方便用GUI工具分析。
4:jmap -finalizerinfo:打印所有待 finalize 的對象迄薄。
注意:jmap依賴于 Java 虛擬機(jī)的Attach API琅关,因此只能監(jiān)控本地的java進(jìn)程。一旦開啟 Java 虛擬機(jī)參數(shù)DisableAttachMechanism(即使用參數(shù)-XX:+DisableAttachMechanism)讥蔽,基于 Attach API 的命令將無法執(zhí)行涣易。 - jinfo
??jinfo命令可用來查看目標(biāo) Java 進(jìn)程的參數(shù),如傳遞給 Java 虛擬機(jī)的-X(即輸出中的 jvm_args)冶伞、-XX參數(shù)(即輸出中的 VM Flags)新症,以及可在 Java 層面通過System.getProperty獲取的-D參數(shù)(即輸出中的 System Properties)。 - jstack
??jstack:主要用來查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息碰缔,而用可以用于發(fā)現(xiàn)死鎖账劲。有如下兩個(gè)參數(shù):
1:-l (long listings)會(huì)打印出額外的鎖信息戳护,在發(fā)生死鎖時(shí)可以用jstack -l pid來觀察鎖持有情況金抡。
2: -m (mixed mode)瀑焦,不僅會(huì)輸出Java堆棧信息,還會(huì)輸出C/C++堆棧信息(比如Native方法)
如果線程數(shù)太多梗肝,可以借助分析操作系統(tǒng)特用的分析工具找出用時(shí)最長的線程榛瓮,然后通過如下圖的命令定位到具體的堆棧信息:
GUI工具
Eclipse MAT
官網(wǎng)地址 http://www.eclipse.org/mat/downloads.php,下載最新的包禀晓,解壓放到eclipse的dropins目錄下,重啟eclipse便可以使用MAT工具分析堆內(nèi)存了坝锰。Memory Analysis視圖的打開方工如下圖:
MAT 計(jì)算對象占據(jù)內(nèi)存的兩種方式粹懒。第一種是 Shallow heap,指的是對象自身所占據(jù)的內(nèi)存顷级。第二種是** Retained heap凫乖,指的是當(dāng)對象不再被引用時(shí),垃圾回收器所能回收的總內(nèi)存**弓颈,包括對象自身所占據(jù)的內(nèi)存帽芽,以及僅能夠通過該對象引用到的其他對象所占據(jù)的內(nèi)存。如下圖所示:
MAT還有一個(gè)重要的視圖便是dominator tree(支配樹), 視圖里是將堆中的所有對象看成一張圖翔冀,每個(gè)對象是一個(gè)圖節(jié)點(diǎn)导街,而 GC Roots 則是對象圖的入口,對象之間的引用關(guān)系則構(gòu)成了對象圖中的有向邊纤子。這樣一來搬瑰,便能夠構(gòu)造出該對象圖所對應(yīng)的支配樹。如下圖所示: