當內存溢出會拋出?java.lang.OutOfMemoryError: Java heap space 的異常,那這個時候怎樣去分析到底哪里導致內存溢出呢?
我們可以通過在vm的參數, -XX:+HeapDumpOnOutOfMemoryError 記住這個理是大寫XX。
當內存溢出后,顯示
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid1034.hprof ...
Heap dump file created [136202426 bytes in 0.908secs]
Exceptionin thread "main"java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at test.a.Test.main(Test.java:11)
然后可以在項目下,找到上面所指的文件,這里的文件叫,java_pid1034.hprof
直接打開是無法知道里面是什么意思,所以需要eclipse提供的一些工具來進行分析, 可以在網上搜索Eclipse?Memory?Analysis,或者在Eclipse Market哪里搜索直接下載相關插件就可以了
下面來看看是怎樣一個分析過程:
首先我們打開eclipse,雙擊項目下,剛才的分析文件,就可以打開分析編輯器,點擊下圖中的按鈕,
在打開的樹種可以看到,其中某一項會占據內存比較多的,如果繼續展開,會發現,這里會告訴你,那一項會是占據內存的主要原因,這里可以清楚地看到,demo的這個對象,有很多,說明創建這個demo的對象,沒有被回收