原创

OOM产生的原因有哪些?

OOM产生的原因多种多样,有些程序未必产生OOM,不断FGC(CPU飙高,但内存回收特别少)
1. 硬件升级系统反而卡顿的问题

2. 线程池不当运用产生OOM问题
不断的往List里加对象(实在太LOW)

3. smile jira问题
实际系统不断重启
解决问题 加内存 + 更换垃圾回收器 G1
真正问题在哪儿?不知道

4. tomcat http-header-size过大问题(Hector)

5. lambda表达式导致方法区溢出问题(MethodArea / Perm Metaspace)
LambdaGC.java -XX:MaxMetaspaceSize=9M -XX:+PrintGCDetails

6. 直接内存溢出问题(少见)
《深入理解Java虚拟机》P59,使用Unsafe分配直接内存,或者使用NIO的问题

7. 栈溢出问题
-Xss设定太小

8. 比较一下这两段程序的异同,分析哪一个是更优的写法:
Object o = null;
for(int i=0; i<100; i++) {
o = new Object();
//业务处理
}

for(int i=0; i<100; i++) {
Object o = new Object();
}

9. 重写finalize引发频繁GC
小米云,HBase同步系统,系统通过nginx访问超时报警,最后排查,C++程序员重写finalize引发频繁GC问题
为什么C++程序员会重写finalize?(new delete)
finalize耗时比较长(200ms)

10. 如果有一个系统,内存一直消耗不超过10%,但是观察GC日志,发现FGC总是频繁产生,会是什么引起的?
例如:System.gc()

11. Distuptor有个可以设置链的长度,如果过大,然后对象大,消费完不主动释放,会溢出

12. 用jvm都会溢出,mycat用崩过,1.6.5某个临时版本解析sql子查询算法有问题,9个exists的联合sql就导致生成几百万的对象

13. new 大量线程,会产生 native thread OOM,(low)应该用线程池,
解决方案:减少堆空间(太TMlow了),预留更多内存产生native thread
JVM内存占物理内存比例 50% - 80%

本文链接地址:http://www.ysxbohui.com/article/238

正文到此结束