Java OOM异常分析

OOM异常分析

Java堆溢出

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

可能的原因有:

  1. 内存泄漏

  2. 内存溢出

    需要从代码上检查是否存在某些对象生命周期过长、持有状态时间过长、存储结构设计不合理的情况, 尽量减少程序运行期的内存消耗

要处理这个内存区域的异常, 常规的处理方法是通过内存映像分析工具对Dump出来的堆转储快照进行分析.

虚拟机栈和本地方法栈溢出

无论是由于栈帧太大还是虚拟机栈容量太小, 当新的栈帧内存无法分配的时候, HotSpot虚拟机抛出的都是StackOverflowError异常

原因可能是:

  1. 线程请求的栈深度大于虚拟机所运行的最大深度

    方法链的调用太长, 例如递归没有退出.

方法区和运行时常量池溢出

在JDK7之后, 字符串常量池被移至Java堆之中, 出现OOM时, 报错信息与Java堆溢出一致, 错误信息提示“Java heap space

本机直接内存溢出

直接内存(Direct Memory)的容量大小可通过-XX:MaxDirectMemorySize参数来指定, 如果不去指定, 则默认与Java堆最大值(由-Xmx指定)一致.

由直接内存导致的内存溢出, 一个明显的特征是在Heap Dump文件中不会看见有什么明显的异常情况.

在程序直接或间接使用了直接内存时(典型的间接使用就是NIO), 可以重点考虑一下直接内存的原因.