背景
運(yùn)維人員在生產(chǎn)服務(wù)器上用定時(shí)任務(wù)隔一段時(shí)間生成GC文件,今天在開發(fā)群里由報(bào)警機(jī)器人發(fā)送了一條消息"xxx應(yīng)用發(fā)現(xiàn)GC文件,下載地址:xxxx",然后總監(jiān)親自給我們展示了如何去分析GC文件來判斷是否有內(nèi)存泄漏。
dump二進(jìn)制文件-hprof
關(guān)于如何生成hprof文件,可以詳細(xì)查閱一下jmap指令.
我這里直接貼出JVM指令:
# 使用jps查看進(jìn)程號,也就是pid
$> jps
# 使用jmap導(dǎo)出dump文件
$> jmap -dump:format=b,file=mydump.hprof pid

dump
MemoryAnalyzer
使用大名鼎鼎的"MAT"(Memory Analyzer Tool)可以很好的分析dump文件.
下載地址: 官網(wǎng)
配置堆棧大小-MemoryAnalyzer.ini
-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.700.v20180518-1200
-vmargs
-Xmx4096m
打開dump文件-open file
- 打開dump文件

open-dump
點(diǎn)擊finish即可

finish
擒賊先擒王-Leak Suspects

Leak Suspects
看到Leak Suspects一開始我還有點(diǎn)懵逼,為此我還專門去查了一下google.

leak suspects
ok,這里我們看到,MAT把泄漏嫌疑最大的幾個(gè)case展示出來了,那么我們可以從最大的嫌疑犯開始,直接看Problem Suspect 1.

1
- 查看內(nèi)存分配樹、Thread Stack

button
- 內(nèi)存分配樹

tree
這里說一下: 如果懷疑是SQL的問題,可以在堆棧中找找這個(gè)包所綁定的SQL:
org.apache.ibatis.mapping.BoundSql.
- Thread OverView

details
這里提供一個(gè)快速查找的技巧,一般公司的項(xiàng)目,都會有特定的包路徑,直接ctrl+F查找相關(guān)關(guān)鍵字即可,比如百度的項(xiàng)目,直接搜索"baidu".
結(jié)果
最后,我們定位到了一個(gè)SQL未進(jìn)行分頁,造成了內(nèi)存泄漏。這里不對結(jié)果進(jìn)行展示了.