OMM

来源:互联网 发布:软件项目进展汇报 编辑:程序博客网 时间:2024/06/10 18:41

OMM主要三类: permgen OOM ,heap OOM, stack overflow 

permgen OOM: 这个主要是由于加载的类太多,或者反射的类太多,还有调用 String.intend(jdk7之前)也会造成这个问题。所以出现了这个问题,就检查这三个方面;

heap OOM:主要是因为一些无用对象没有及时释放造成的,检查代码加上 heap dump 去分析.

stack overflow:这个主要是由于调用层数,或者递归深度太大造成的,看异常信息,基本上就能定位得出来了.

内存泄漏检查

年老代堆空间被占满

异常: java.lang.OutOfMemoryError: Java heap space

解决:

    这种方式解决起来也比较容易,一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。

 

持久代被占满

异常:java.lang.OutOfMemoryError: PermGen space

解决:

    1.-XX:MaxPermSize=16m

 

堆栈溢出

异常:java.lang.StackOverflowError

说明:这个就不多说了,一般就是递归没返回,或者循环调用造成

 

 

线程堆栈满

异常:Fatal: Stack size toosmall

说明:java中一个线程的空间大小是有限制的。JDK5.0以后这个值是1M。与这个线程相关的数据将会保存在其中。但是当线程空间满了以后,将会出现上面异常。

解决:增加线程栈大小。-Xss2m。但这个配置无法解决根本问题,还要看代码部分是否有造成泄漏的部分。

 

系统内存被占满

异常:java.lang.OutOfMemoryError:unable to create new native thread

这个异常是由于操作系统没有足够的资源来产生这个线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。因此,当线程数量大到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。