OutOfMemoryError

一、堆溢出
java.lang.OutOfMemoryError: Java heap space
原因:
1、代码中存在大对象分配
2、可能存在内存泄露。
解决方法:
1、基于内存调整来改变堆区内存大小以便能够存储更多的对象,使用 -Xmx 加大堆内存
2、通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题
3、从代码上检查是否存在某些对象的生命周期过长、持有状态时间过长的情况,尝试减少程序在运行期的内存消耗
二、永久代/元空间溢出

java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Metaspace
原因:
1、永久区的内存溢出,其实就是堆的内存不够用。
解决方法:
1、调整堆大小 -Xms256m -Xmx1024m
2、检查是否永久代空间或者元空间设置的过小 -server -XX:PermSize=128M -XX:MaxPermSize=256m
三、GC overhead limit exceeded
java.lang.OutOfMemoryError:GC overhead limit exceeded
原因:
1、这个是JDK6新加的错误类型,一般都是堆太小导致的。Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。俗话说就是堆内存给的太小
解决方法:
1、检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。
2、检查是否存在内存泄露,如果没有,加大内存-Xms512m -Xmx1024m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m。
四、方法栈溢出
java.lang.OutOfMemoryError : unable to create new native Thread
原因:
1、系统内存耗尽,无法为新线程分配内存
2、创建线程数超过了操作系统的限制
解决方法:
1、jstack查看否创建了过多的线程
2、ulimit -u查看系统线程数限制大小
3、通过-Xss256k降低的每个线程栈大小的容量

浙公网安备 33010602011771号