Java OOM异常分析
OOM异常分析
Java堆溢出
Java堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况. 出现Java堆内存溢出时, 异常堆栈信息“java.lang.OutOfMemoryError”会跟随进一步提示“Java heap space
“
可能的原因有:
-
内存泄漏
-
内存溢出
需要从代码上检查是否存在某些对象生命周期过长、持有状态时间过长、存储结构设计不合理的情况, 尽量减少程序运行期的内存消耗
要处理这个内存区域的异常, 常规的处理方法是通过内存映像分析工具对Dump出来的堆转储快照进行分析.
虚拟机栈和本地方法栈溢出
无论是由于栈帧太大还是虚拟机栈容量太小, 当新的栈帧内存无法分配的时候, HotSpot虚拟机抛出的都是StackOverflowError
异常
原因可能是:
-
线程请求的栈深度大于虚拟机所运行的最大深度
方法链的调用太长, 例如递归没有退出.
方法区和运行时常量池溢出
在JDK7之后, 字符串常量池被移至Java堆之中, 出现OOM时, 报错信息与Java堆溢出一致, 错误信息提示“Java heap space
“
本机直接内存溢出
直接内存(Direct Memory)的容量大小可通过-XX:MaxDirectMemorySize参数来指定, 如果不去指定, 则默认与Java堆最大值(由-Xmx指定)一致.
由直接内存导致的内存溢出, 一个明显的特征是在Heap Dump文件中不会看见有什么明显的异常情况.
在程序直接或间接使用了直接内存时(典型的间接使用就是NIO), 可以重点考虑一下直接内存的原因.