1、堆溢出,堆是存放实例对象的,但是这样堆区迟早会满。设置了堆区内存,创建就会抛出异常。
publicclassHeapOOM{ staticclassUser{} publicstaticvoidmain(String[]args){ List<User>list=newArrayList<User>(); while(true){ list.add(newUser()); } } } /*Exceptioninthread"main"java.lang.OutOfMemoryError: GCoverheadlimitexceeded atcom.fdd.test.HeapOOM.main(HeapOOM.java:11)*/
2、虚拟机栈和本地方法栈溢出
如果线程要求的堆栈深度大于虚拟机锁允许的深度,则抛出StackOverflowEror异常。
如果虚拟机在扩展堆栈时无法申请足够的存储空间,则会出现异常。
publicclassStackOutOfMemoryError{ publicstaticvoidmain(String[]args){ test(); } privatestaticvoidgo(){ System.out.println("StackOverflowError异常"); test(); } } /*Exceptioninthread"main"java.lang.StackOverflowError atsun.nio.cs.ext.DoubleByte$Encoder.encodeLoop(DoubleByte.java:617) atjava.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579) atsun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271) atsun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) atjava.io.OutputStreamWriter.write(OutputStreamWriter.java:207) atjava.io.BufferedWriter.flushBuffer(BufferedWriter.java:129) atjava.io.PrintStream.write(PrintStream.java:526) atjava.io.PrintStream.print(PrintStream.java:597) atjava.io.PrintStream.println(PrintStream.java:736) atcom.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:11) atcom.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:13)*/
3、方法区和运行时常量池溢出
4、本机直接内存溢出
DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如不指定,默认与Java堆的值(-Xmx指定)相同。
以上就是java内存溢出的四种情况,我们对于可能会产生的内存溢出问题进行了分类的归纳,大家想要更深入的了解这部分的问题,可以找一些不同类型的内存溢出实例进行练习。更多Java学习指路:Java基础
原文来自:https://www.py.cn© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容