MAT是一個強大的內存分析工具,可以快捷、有效地幫助我們找到內存泄露,減少內存消耗分析工具。
內存中堆的使用情況是應用性能監測的重點,而對於堆的快照,可以dump出來進一步分析,總的來說,一般我們對於堆dump快照有三種方式:
- 添加啟動參數發生OOM時自動dump: java應用的啟動參數一般最好都加上
-XX:+HeapDumpOnOutOfMemoryError
及-XX:HeapDumpPath=logs/heapdump.hprof
,即在發生OOM時自動dump堆快照,但這種方式相當來說是滯后的(需要等到發生OOM后)。 - 使用命令按需手動dump: 我們也可以使用
jmap -dump:format=b,file=HeapDump.hprof <pid>
工具手動進行堆dump和線程dump - 使用工具手動dump:jvisualvm有提供dump堆快照的功能,點擊一下即可。
使用MAT,可以輕松實現以下功能:
- 找到最大的對象,因為MAT提供顯示合理的累積大小(
retained size
) - 探索對象圖,包括
inbound
和outbound
引用,即引用此對象的和此對象引出的。 - 查找無法回收的對象,可以計算從垃圾收集器根到相關對象的路徑
- 找到內存浪費,比如冗余的String對象,空集合對象等等。
之前使用arthas,可以診斷stack、thread、class、function的性能及調用分析,
arthas依賴jdk,如果jre需要手工安裝jps、tools.jar等,但
arthas沒有整合jmap功能,沒有heap分析。
所以目前看來在線jvm診斷 arthas、jmap加上eclipse mat就可以覆蓋性能分析、heap分析的全部要求了。