JDK本身為調試內存洩漏問題提供了比較完善的工具
先用命令jps找出要調試的jvm的進程id(jps這個命令就是ps命令前面加j列出所有正在運行的jvm的進程id)
例如jps
輸出類似下面這樣 java_appjar startupjar Jps Main Bootstrap
假設我們要調試的進程id是
如果只是想簡單觀察一下堆內存的使用情況可以用命令jmap histolive 這個命令會輸出指定的jvm上當前各個Java類的實例數占用的內存大小和完整的類名虛擬機內部類的類名前面有*標記
如果想得到堆內存使用的詳細情況可以用命令jmap dumpliveformat=bfile=/tmp/java_appheapbin
這樣在/tmp目錄下得到一個java_appheapbin文件其中保存的信息就是指定的jvm中堆內存的使用詳情這個二進制文件可以用JDK附帶的jhat(Java Heap Analysis Tool)來分析
jhat JXmxm /tmp/java_appheapbin
這個工具相當耗內存如果出現了OutOfMemoryException的話請加大JXmxm中指定的預留堆內存大小再試
Jhat會解析堆內存信息轉儲文件(上面用jmap生成的bin文件)輸出大概像下面這樣
lewis@mgr $ jhat JXmxm /tmp/java_appheapbin Reading from /tmp/java_appheapbin……
Dump file created Thu Sep CST Snapshot read resolving……
Resolving objects……
Chasing references expect dots……
Eliminating duplicate references……
Snapshot resolved Started HTTP server on port Server is ready
注意最後兩行堆內存信息轉儲文件分析完畢後jhat並不會將分析結果輸出為一個靜態文件
為了方便查找以及在相關的類之間導航jhat會啟動一個服務監聽端口這時候就可以用浏覽器來浏覽和分析結果了在浏覽器地址欄裡輸入
//localhost
裡面的各個頁面都有很多鏈接可以在相關的各個類及各種統計數據之間跳轉還是很方便的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26117.html