1-我在代碼中添加了一個存在內存溢出方法
@RequestMapping(value = "/testOOM")
public void testOOM() throws Exception{
logger.info("開始...");
ArrayList<String> al = new ArrayList<String>();
while(true){
al.add(new String("nice nice nice ~~"));
}
}
2-在eclipse中調整tomcat的可用內存以加快OOM進度
-Xms64m -Xmx128m -XX:MaxPermSize=64m
3-訪問此方法等待結果
java.lang.OutOfMemoryError: Java heap space
java.util.Arrays.copyOf(Arrays.java:3181)
java.util.ArrayList.grow(ArrayList.java:261)
java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
java.util.ArrayList.add(ArrayList.java:458)
com.sigmatrix.web.enterprise.business.controller.SchedulerController.testOOM(ErpXhtxSchedulerController.java:808)
日誌明確告訴你是808行的原因,此時,你知道你該咋辦了,但是
4-我就想看看OOM時內存是啥樣的咋辦
爲了讓eclipse中運行的tomcat在發生OOM時自動dump堆棧信息:
需要在windows--preferences--tomcat--JDK--optional Java VM
Arguments添加兩條參數
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=E:/oom/oom.hprof
參數說明
(1)-XX:+HeapDumpOnOutOfMemoryError 表示當JVM發生OOM時,自動生成DUMP文件。
(2)-XX:HeapDumpPath=存儲文件/目錄 表示生成DUMP文件的路徑
到此我們一共設置了
-Xms64m -Xmx128m -XX:MaxPermSize=64m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=E:/oom/oom.hprof
5-重啓tomcat並訪問此方法
會發現在設置的目錄下確實生成了一個hprof文件
6-咋看這個文件?怎麼分析?
我們需要首先在eclipse中安裝一個插件MAT,安裝完畢之後,重啓eclipse
[這是個專門分析堆棧信息的插件,具體安裝自行百度]
7-重啓完畢,在eclipse裏切換到Memory Analysis視圖,File-Open Heap Dump–選擇dump文件
打開之後,在Overview下找到Histogram或者dominator_tree,可以清晰看到OOM時的內存情況
oh shit!圖片怎麼上傳不了?這咋回事?這不坑人嗎?