JVMHotspot OutOfMemory异常信息整理

在java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都又发生OutOfMemory(简称:OOM)异常的可能。

1.java堆内存溢出

java.lang.OutOfMemoryError:Java heap space

Java堆内存的OOM异常实际应用中常见的内存溢出异常情况。当出现Java堆内存溢出时,异常堆栈信息“Java.lang.OutOfMemoryError” 会跟着进一步提示“Java heap space”

2.方法区和运行常量池溢出
运行时常量池是方法区的一部分,所以就合并来说。

Exception in thread "main" java.lang.OutOfMemoryError:PerGen space

如果在控制台看到上述代码出现,则表明运行时常量池发生溢出 ,在OutOfMemoryError后面跟随提示信息:“PermGen space”,说明运行时常量池属于方法区(HotSpot虚拟机中的永久代)的一部分。

3.虚拟机栈和本地方法栈溢出
由于HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此,虽然设置本地方法栈大小的参数
(-Xoss)存在,但是无效,栈容量只能由-Xss参数设定。

关于虚拟机栈和本地方法栈溢,在java虚拟机规范中描述了两种异常:

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常
如果虚拟机在扩展栈时无法申请到足够内存空间,则抛出OutOfMemoryError异常
虽然分成两种情况,但是这两者也有一些共同之处:当栈空间无法继续分配时,到底是内存大小,还是已使用的栈空间太大,其本质上只是对同一件事情的两种描述。

4.本机直接内存溢出

Exception in thead "main" java.lang.OutOfMemoryError

由DirectMemory导致的内存溢出, 一个明显的特征是在Heap Dump文件中不会看见明显的异常,如果发现OOM之后Dump文件很小,而程序中有直接或间接使用了NIO,有可能就是这方面的原因。

猜你喜欢

转载自blog.csdn.net/fight252/article/details/91157608