天天看點

eclipse MemoryAnalyzer 看記憶體洩露

工具下載下傳連結:

http://iso.mirrors.ustc.edu.cn/eclipse/mat/1.7/rcp/MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64.zip

示例代碼:

import java.util.Map;  

import java.util.HashMap;  

public class JVMOutOfMemoryErrorSimulator {  

       private final static int NB_ITERATIONS = 500000;  

       // ~1 KB data footprint  

       private final static String LEAKING_DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata";  

       // Map used to stored our leaking String instances  

       private static Map<String, String> leakingMap;  

       static {  

              leakingMap = new HashMap<String, String>();  

       }  

       public static void main(String[] args) {  

              System.out.println("JVM OutOfMemoryError Simulator 1.0");  

              System.out.println("Author: Pierre-Hugues Charbonneau");  

              System.out.println("http://javaeesupportpatterns.blogspot.com/");  

              try {  

                     for (int i = 0; i < NB_ITERATIONS; i++) {  

                           String data = LEAKING_DATA_PREFIX + i;  

                           // Add data to our leaking Map data structure...  

                           leakingMap.put(data, data);  

                     }  

              } catch (Throwable any) {  

                     if (any instanceof java.lang.OutOfMemoryError) {  

                            System.out.println("OutOfMemoryError triggered! "  

                                         + any.getMessage() + " [" + any + "]");  

                     } else {  

                           System.out.println("Unexpected Exception! " + any.getMessage()  

                                         + " [" + any + "]");  

                     }  

              }  

              System.out.println("simulator done!");  

       }  

}  

------------

程式輸出:

JVM OutOfMemoryError Simulator 1.0

Author: Pierre-Hugues Charbonneau

http://javaeesupportpatterns.blogspot.com/

java.lang.OutOfMemoryError: Java heap space

Dumping heap to java_pid15000.hprof ...

Heap dump file created [129086814 bytes in 0.464 secs]

Exception in thread "main" 

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"

dump檔案産生在工程目錄下:

D:\guolong\eclipsework\testWorkspace\TestProjectjava_pid15000.hprof

step1

導入上述dump檔案

eclipse MemoryAnalyzer 看記憶體洩露

step2:點,檢視可疑洩露項

eclipse MemoryAnalyzer 看記憶體洩露

step3 找到産生記憶體洩露的類,并點開詳情:

eclipse MemoryAnalyzer 看記憶體洩露

step4:定位産生洩露對象,類中變量的位置

eclipse MemoryAnalyzer 看記憶體洩露

HashMap源碼中,table屬性的位置:

eclipse MemoryAnalyzer 看記憶體洩露

HashMap源碼中,Node結構的定義:

eclipse MemoryAnalyzer 看記憶體洩露

繼續閱讀