tomcat內存溢出的分析過程

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!圖片怎麼上傳不了?這咋回事?這不坑人嗎?

發佈了63 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章