产生内存溢出的情况
常见的几种情况:
1、内存加载的数据量过大;
2、集合中有死循环或者循环创建大量的对象;
3、集合类中有对对象引用,使用完后未清除,使得JVM 不能回收;
4、第三方的BUG ;
5、启动参数内存值设定过小;
解决方法:
情况一:java.lang.OutOfMemoryError:Javaheapspace
java 堆内存不足。一种是内存太小,内存数据量太多(或者递归调用的层数太多)导致的;另一种是程序中产生了死循环。
如果是java 堆内存不够,通过设置JVM 中的配置:
-Xmx3072m(设置JVM最大内存)
-Xms3072m(修改初始内存)
情况二:java.lang.OutOfMemoryError:GCoverheadlimitexceeded
JDK6新增的,当GC释放小空间占用大量时间,抛出该异常,一般是由于堆内存过小导致。
1、查看系统是否有大块的内存代码或者死循环,导致没有足够的空间。
2、通过添加JVM配置,来限制使用内存
-XX:-UseGCOverheadLimit
情况三:java.lang.OutOfMemoryError:PermGenspace
JVM P区(年老代)主要是存储class 和Meta 信息,GC在主程序运行期间不会对年老代进行清理,年老代默认是64M。当加载的对象较多的时候会报错。
可修改JVM 配置:
-XX:MaxPermSize=128M
-XXermSize=128m
情况四:java.lang.OutOfMemoryError:Directbuffermemory
该情况一般调用三方的时候可能会出现
通过调整JVM配置解决:
-XX:MaxDirectMemorySize=128M
情况五:java.lang.OutOfMemoryError:unabletocreatenewnativethread
一般是创建线程的时候栈空间不足,或者是创建线程过多导致的。
JVM并没有直接调整总的栈空间的参数,一般可通过;
1、-Xss减少单个线程的栈大小
2、-Xms-Xmx两个参数减少Head大小,将内存让给栈。
情况六:java.lang.StackOverflowError
线程栈溢出,一般是线程出现调用层次过多(无效递归)或者栈太小导致的。
解决方案:优化代码,减少方法调用层次。
调整-Xss参数增加线程栈大小