首页 > 代码库 > OOM问题定位

OOM问题定位

参考:

http://blog.itpub.net/28912557/viewspace-1455299/

 

    一:堆内存溢出

    Java创建的对象一般都是分配在堆中。我们在上一篇博文讲过,JVM的堆又分为 新生代、老年代、永久代(Java8已移除)。那么堆中出现OOM异常一般在就是因为在这几个地方内存不足导致的了。一般报错:

    Exception in thread \"main\" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2760)
        at java.util.Arrays.copyOf(Arrays.java:2734)
        at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
        at java.util.ArrayList.add(ArrayList.java:351)
        at test.java.VM.OOM.HeapOOM.main(HeapOOM.java:19)

 

    二:方法区内存溢出

    方法区主要存放类的信息、静态变量、运行时常量、Field、Method信息等,当不停地有类动态创建并加载时,方法区也能产生OOM。

    报错信息:

Exception in thread \"main\" java.lang.OutOfMemoryError: PermGen space

 

   三:栈溢出

   栈的异常有两种:

   JVM在执行方法时就会创建方法栈,方法的递归、调用等使得其他方法不停地入栈,其他方法执行完毕就会弹出栈帧。当一个方法栈的深度大于JVM所允许的深度时就会报StackOverFlow;一般,出现StackOverFlow时就要检查代码是否有无穷递归的情况出现了。

    stack length:1007Exception in thread \"main\" java.lang.StackOverflowError

        at test.java.VM.OOM.JavaVMStackOF.stackLeak(JavaVMStackOF.java:13)
        at test.java.VM.OOM.JavaVMStackOF.stackLeak(JavaVMStackOF.java:14)

 

   栈空间扩展时没有足够的内存则报OutOfMemory。

   

   

OOM问题定位