oom問題定位


產生oom時,可以通過查看快照的方式來分析原因,如何生成快照以及怎樣查看分析該快照是本篇要討論的內容。

1.工具:eclipse(安裝Memory Analyzer 插件)

2.java參數:

-XX:+PrintGCDetails -Xloggc:/data/logs/JavaDemo/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/JavaDemo -Xms1m -Xmx1m、
其中:
-XX:+PrintGCDetails 打印gc日志
-Xloggc:/data/logs/JavaDemo/gc.log gc日志的地址
-XX:+HeapDumpOnOutOfMemoryError 出現內存溢出異常時dump出當前的內存轉儲快照
-XX:HeapDumpPath=/data/logs/JavaDemo 指定快照的存放位置
-Xms1m jvm初始內存
-Xmx1m jvm最大內存
此處設置jvm內存較小是為了之后模擬oom時更快報錯。平時項目里不用這么設置。

3.oom現場
1)產生oom的測試代碼
package common;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by zuzhaoyue on 18/6/12.
 */
public class OOMTest {
    //java堆溢出
    // -XX:+PrintGCDateStamps -Xloggc:/data/logs/JavaDemo/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/JavaDemo -Xms1m -Xmx1m
    public void  headSpaceOOM(){
        List list = new ArrayList<>();
        while(true)
        {
            list.add(new OOMTest());
        }
    }
   
    public static void main(String args[]) {
        new OOMTest().headSpaceOOM();

}
}

 

執行上段代碼結果如下

java.lang.OutOfMemoryError: Java heap space
Dumping heap to /data/logs/JavaDemo/java_pid42294.hprof ...
Heap dump file created [2758120 bytes in 0.029 secs]
Exception in 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)

...

2)用hprof快照文件定位

使用eclipse,File->OpenFile->選擇/data/logs/JavaDemo/java_pid42294.hprof,界面如下

 

可以看到有一個占了927.4kb的對象,往下拉可以看到工具猜測的問題點,

 

點擊,Details基本上就能定位到問題了:

顯示有一個對象占用了78.35%的jvm內存,再看stacktrace

哪一行都指出來了,太明顯了。

當然通過觀察里面的對象的大小也可以看出來,點擊左數第三個按鈕:

可以看到所有對象的大小,如下:

第一個占了大部分內存的對象,點開:

可以看到占了很多內存的對象是一個OOMTest數組,這樣也能基本定位到問題~

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM