关于Heap Dump
轉載自? ?關于Heap Dump
Heap Dump是什么?
Heap Dump也叫堆轉儲文件,是一個Java進程在某個時間點上的內存快照。Heap Dump是有著多種類型的。不過總體上heap dump在觸發快照的時候都保存了java對象和類的信息。通常在寫heap dump文件前會觸發一次FullGC,所以heap dump文件中保存的是FullGC后留下的對象信息。
我們可以通過Heap Dump做哪些事情?
一般在Heap Dump文件中可以獲取到(這仍然取決于heap dump文件的類型)如下信息:
對象信息:類、成員變量、直接量以及引用值;
類信息:類加載器、名稱、超類、靜態成員;
Garbage Collections Roots:JVM可達的對象;
線程棧以及本地變量:獲取快照時的線程棧信息,以及局部變量的詳細信息。
也就是說我們可以對上面這些內容進行分析。通常可以基于Heap Dump分析如下類型的問題:
找出內存泄漏的原因;
找出重復引用的jar或類;
分析集合的使用;
分析類加載器。
總而言之我們對Heap Dump的分析就是對應用的內存使用進行分析,從而更加合理地使用內存。
怎樣獲取Heap Dump?
獲取heap dump有多種方式,可以通過參數配置在特定的條件下觸發堆轉儲,也可以通過工具來獲取。
1. 通過OutOfMemoryError獲取heap dump
通過設置如下的JVM參數,可以在發生OutOfMemoryError后獲取到一份HPROF二進制Heap Dump文件:
-XX:+HeapDumpOnOutOfMemoryError
生成的文件會直接寫入到工作目錄。
這個方案適用于如下版本的虛擬機:Sun JVM (1.4.2_12 or higher and 1.5.0_07 or higher), HP-UX JVM (1.4.2_11 or higher) and SAP JVM (since 1.5.0)。
2. 主動觸發Heap Dump
也可以為虛擬機設置下面的參數,這樣就可以在需要的時候按下CTRL+BREAK組合鍵隨時獲取一份heap dump文件。
-XX:+HeapDumpOnCtrlBreak
| 3. 使用HPROF agent |
使用agent可以在程序執行結束時或者收到SIGQUIT信號時生成dump文件。使用agent也是要配置虛擬機參數的:
-agentlib:hprof=heap=dump,format=b
這種方式我沒有試過,具體如何做的不是很清楚。
4. 使用jmap
這個算是用的最多的方式了吧。也很簡單,執行下面的命令就可以了:
jmap -dump:format=b,file=<filename.hprof> <pid>
5. 使用jconsole
啟動一個應用后,打開<JAVA_HOME>/bin/jconsole.exe,在jconsole中選擇正在運行的應用:
(在這個例子中選擇的是eclipse,雖然進程名稱為空,但是通過重啟eclipse可以確認)。
建立連接后,選擇頁簽MBean,執行com.sun.management. HotSpotDiagnostic下的操作dumpHeap。第一個參數p0是要獲取的dump文件的完整路徑名,記得文件要以.hprof作為擴展名(要在Memory AnalysisPerspective下打開擴展名必須是這個)。如果我們只想獲取live的對象,第二個參數p1需要保持為true。
建議將導出的dump文件保存到一個獨立的文件夾,在接下來的分析中會通過這個文件創建很多圖表文件。
6. 使用Memory Analyzer
如果要獲取dump文件的Java進程和Memory Analyzer在同一臺機器上,可以直接使用Memory Analyzer獲取dump文件。采用這種方式獲取dump文件后會直接將之解析并在Memory Analyzer中打開(這個方式我不太喜歡,因為會在用戶目錄下生成很多零碎的文件)。
獲取heap dump是受虛擬機支持的一種特定的功能。Memory Analyzer提供了一些被稱為Heap Dump Provider的概念:比如支持Sun虛擬機(需要用到Sun JDK的jmap功能)的Provider或支持IBM虛擬機(也需要一個IBM JDK)的Provider。此外,Memory Analyzer也提供了對用戶自定義的Heap Dump Provider插件的擴展支持。
要使用Memory Analyzer獲取dump文件需要先打開Memory AnalysisPerspective,而后點擊File -> Acquire Heap Dump…菜單項。之后會打開如下窗口:
在上圖中,根據具體的運行環境,預裝的Heap Dump Provider按照默認設置展示了當前正在運行的java進程列表。一些Heap Dump Provider也允許(或者說需要)設置一些額外的參數(比如heap dump的類型),這個可以點擊Configure按鈕來設置。選擇要dump的線程,點擊Next按鈕就可以生成dump文件了。
有的時候進程列表可能為空,這時有必要調整下Heap Dump Provider的設置了。點擊Configure按鈕,選擇合適的provider并點擊,然后找到要做調整的參數并做設置就好了。
此外,IBM的虛擬機還有自己的一套方法,這里就不寫出了。
總結
以上是生活随笔為你收集整理的关于Heap Dump的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Java类到对象的创建过程都做了些啥?
- 下一篇: 电脑配置2022(电脑配置2016)