参考:
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。
时间: 2024-11-04 18:12:15