Java中內存泄露的分析

jopen 10年前發布 | 22K 次閱讀 Java Java開發

在分析項目中的內存泄露情況,使用了Eclipse Memory Analyzer,移步到這里下載最新版本:

http://www.eclipse.org/mat/

</div>

我們知道,不同版本的虛擬機和JDK版本,垃圾回收機制和內存空間布局都是有所差別的,我使用的是這個版本的JDK

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)

</div>

1、下面監控一下我開發環境下的Resin服務器:

首先,運行JDK bin目錄下的jconsole.exe文件,鏈接到Resin服務器:

Java中內存泄露的分析

進入之后,就可以查看到堆內存,類,CPU的使用情況了。

細心的讀者發現了我使用的是主流的HotSpot虛擬機。選擇 com.sun.management-->HotSpotDiagnostic-->操作-->dumpHeap(堆轉儲),在操作調用中的p0填寫導出目錄,點擊dumpHeap即可:

Java中內存泄露的分析

這樣就可以在p0對應的輸出目錄中找打導出的文件了:dumpHeap.hprof

接下來啟動MemoryAnalyzer, File --> Open File... 選擇剛才導出的文件進行分析。

選擇目錄中的Path To GC Roots --> exclude weak/soft references 排除掉弱引用,剩下的才是最有可能導致內存泄露的問題:

Java中內存泄露的分析

目前查看到的都是classloader加載到的Class文件的引用,并沒有發現異常信息:

Java中內存泄露的分析

繼續觀察,發現問題隨時分析。

哦對了,ClassLoader也是有可能產能內存泄露的哦,詳細請查看我的這篇文章:

</div>

2、監控一段測試程序:

可以通過配置Java的 -XX:+HeapDumpOnOutOfMemoryError 參數讓虛擬機在出現內存溢出異常時Dump出當前的內存堆轉儲快照。

下面是來自深入理解Java虛擬機的例子:

/**

  • VM Args:-verbose:gc -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
  • 限制Java堆大小為20M,不可擴展,讓虛擬機在出現內存溢出異常時Dump出當前的內存堆轉儲快照
  • @Author zzm */ public class HeapOOM{ static class OOMObject{ } public static void main(String[] args){

     List list = new ArrayList();
     while(true){
         list.add(new OOMObject());
     }
    

    } }</pre>

    執行后可以發現轉儲快照被導出了:

    Dumping heap to java_pid4148.hprof ...
    Heap dump file created [24728647 bytes in 0.342 secs]
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.ensureCapacity(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at me.arthinking.memoryleaktest.HeapOOM.main(HeapOOM.java:18)

    </div>

    接下來使用MemoryAnalyzer分析這個文件就可以了。

    如果是內存泄露,可以進一步通過查看泄露對象到GC Roots的引用鏈。

    如果不存在內存泄露,就應當堅持虛擬機的堆參數(-Xmx和-Xms)。


     原文地址: http://www.itzhai.com/java-memory-leak-analyze.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!