日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于Heap Dump

發布時間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。