遇到OOM如何处理?

面试题Category: Java遇到OOM如何处理?
Anonymous asked 3 years ago

假如一个系统出现OOM的情况,做了JVM参数调整还是出现这样的情况,硬件内存已经不允许继续调大,该如何处理?

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 遇到OOM如何处理?

FavoriteLoading添加本文到我的收藏
3 Answers
Best Answer
胖子码农 Staff answered 3 years ago

首先,要搞清OOM的分类:
OMM主要三类: permgen OOM , heap OOM, stack overflow 
permgen OOM: 这个主要是由于加载的类太多,或者反射的类太多, 还有 调用 String.intend(jdk7之前)也会造成这个问题。所以出现了这个问题,就检查这三个方面;
heap OOM: 基本是按照 1楼的方式就可以解决了,主要是因为一些无用对象没有及时释放造成的,检查代码加上 heap dump 去分析吧
stack overflow: 这个主要是由于调用层数,或者递归深度太大造成的,看异常信息,基本上就能定位得出来了

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 回答遇到OOM如何处理?

FavoriteLoading添加本文到我的收藏
michaelchan Staff answered 3 years ago

把内存大户找出来。
 
1. 可通过命令定期抓取heap dump 或者 启动参数OOM时 自动抓取heap dump
2. 通过对比多个heap dump,以及heap dump的内容,找出内存大户
3. 分析占用的内存对象,是否是因为错误导致的内存未及时释放,或者 数据过多导致的内存溢出
4. 根据原因,fix bug 或者 修改方案

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 回答遇到OOM如何处理?

FavoriteLoading添加本文到我的收藏
hqcao Staff answered 2 years ago

首先搞清楚是什么原因引起的,是内存泄露还是内存溢出,当然内存泄露是内存溢出的一个原因。
 
堆内存溢出outOfMemoryError:java heap space
       在jvm规范中,堆中的内存是用来生成对象实例和数组的。
       如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。
       当生成新对象时,内存的申请过程如下:
          a、jvm先尝试在eden区分配新建对象所需的内存;
          b、如果内存大小足够,申请结束,否则下一步;
          c、jvm启动youngGC,试图将eden区中不活跃的对象释放掉,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
          d、Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
          e、 当OLD区空间不够时,JVM会在OLD区进行full GC;
          f、full GC后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”:outOfMemoryError:java heap space
 
方法区内存溢出outOfMemoryError:permgem space
       在jvm规范中,方法区主要存放的是类信息、常量、静态变量等。
       所以如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出,一般该区发生内存溢出时的错误信息为:outOfMemoryError:permgem space
 
线程栈溢出java.lang.StackOverflowError
       线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。
       一般线程栈溢出是由于递归太深或方法调用层级过多导致的。
       发生栈溢出的错误信息为:java.lang.StackOverflowError
 
常见oom大概这几种,针对这几种进行解决。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 回答遇到OOM如何处理?

FavoriteLoading添加本文到我的收藏

return top