一個現實的案例研究將用于此目的:Weblogic 9.2內存泄漏影響Weblogic Admin服務器。
環境規格
- Java EE服務器:Oracle Weblogic Server 9.2 MP1
- 中間件操作系統:Solaris 10
- Java虛擬機:Sun HotSpot 1.5.0_22
- 平臺類型:中間層
監控和故障排除工具
- Quest Foglight(JVM和垃圾收集監視)
- jmap(hprof /堆轉儲生成工具)
- 通過IBM支持助手進行的Memory Analyzer 1.1(hprof堆轉儲分析)
- 平臺類型:中間層
步驟#1 – WLS 9.2管理服務器JVM監視和泄漏確認
Quest Foglight Java EE監視工具對于從Weblogic Admin服務器識別Java堆泄漏非常有用。 如下所示,Java Heap內存隨著時間的推移而增長。
如果您沒有為Weblogic環境使用任何監視工具,那么我建議您至少啟用HotSpot VM的verbose:gc。 請訪問有關此主題的Java 7 verbose:gc教程 ,以獲取更多詳細說明。

步驟#2 –從泄漏的JVM生成堆轉儲
發現JVM內存泄漏后,目標是使用Sun JDK jmap實用程序生成堆轉儲文件(二進制格式)。
**請注意,生成jmap堆轉儲將導致您的JVM無法響應,因此請確保在運行jmap實用程序之前 ,沒有更多的流量發送到受影響的/泄漏的JVM **
<JDK HOME>/bin/jmap -heap:format=b <Java VM PID>
此命令將生成泄漏的JVM的堆轉儲二進制文件(heap.bin)。 文件的大小和生成過程所花費的時間將取決于您的JVM大小和計算機規格/速度。

對于我們的案例研究,在大約1小時的時間里生成了約2 GB的二進制堆轉儲文件。
由于OutOfMemoryError并在JVM啟動參數中添加-XX:+ HeapDumpOnOutOfMemoryError,也會自動生成Sun HotSpot 1.5 / 1.6 / 1.7堆轉儲文件。
步驟#3 –在Memory Analyzer工具中加載堆轉儲文件
現在是時候在Memory Analyzer工具中加載堆轉儲文件了。 加載過程將需要幾分鐘,具體取決于堆轉儲的大小和計算機的速度。


步驟#4 –分析您的堆轉儲
內存分析器為您提供了許多功能,包括“可疑泄漏”報告。 對于此案例研究,以Java堆直方圖為起點來分析泄漏的對象和源。

對于我們的案例研究,發現java.lang.String和char []數據是泄漏的對象。 現在的問題是泄漏的根源是什么,例如那些泄漏對象的引用。 只需右鍵單擊泄漏的對象,然后選擇>>列出對象>帶有傳入引用的引用

如您所見,發現javax.management.ObjectName對象是泄漏的String&char []數據的源。 Weblogic Admin服務器正在通過MBeans / JMX通信并從其受管服務器中提取統計信息,該MBeans / JMX為任何MBean對象類型創建javax.management.ObjectName。 現在的問題是,為什么Weblogic 9.2無法正確發布此類對象……
根本原因:Weblogic javax.management.ObjectName泄漏!
在我們進行堆轉儲分析之后,對Weblogic的已知問題進行了回顧,但確實發現了以下Weblogic 9.2錯誤:
- Weblogic錯誤ID:CR327368
- 說明:管理服務器上的javax.management.ObjectName對象的內存泄漏,用于在管理服務器上引起OutOfMemory錯誤。
- 受影響的Weblogic版本:WLS 9.2
- 固定在:WLS 10 MP1
http://download.oracle.com/docs/cd/E11035_01/wls100/issues/known_resolved.html
考慮到我們的堆轉儲分析,WLS版本和此已知問題描述的完美匹配,這一發現是非常確定的。
結論
我希望本教程和案例研究能幫助您了解如何使用jmap和Memory Analyzer工具查明Java Heap泄漏的來源。
請不要猶豫,發表任何評論或問題。
我還提供了免費的Java EE咨詢,因此請給我發電子郵件 ,并向我提供您的堆轉儲文件的下載鏈接,以便我可以為您進行分析并在此Blog上創建一篇文章來描述您的問題,根本原因和解決方案。
參考: HPROF –來自我們的JCG合作伙伴 Pierre-Hugues Charbonneau的內存泄漏分析教程 ,位于Java EE支持模式和Java教程博客中。
翻譯自: https://www.javacodegeeks.com/2012/04/hprof-memory-leak-analysis-tutorial.html