首页 > 作为java项目OutOfMemoryError怎么处理,不是javaweb,不是tomcat溢出?

作为java项目OutOfMemoryError怎么处理,不是javaweb,不是tomcat溢出?

不是web项目,纯java项目
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space


这种问题,建议用findbug或者sonar等工具跑一下程序看看哪里有内存泄露导致内存溢出的风险

java.lang.OutOfMemoryError: Java heap space是堆内存的年轻年老态内存空间都用完时候就会抛,所以一般来说此问题主要是创建的内存无法回收,例如最常见的IO类用完后不做xx.close()

光是在TOMCAT配置大内存是不够了,需要找到源头,如果有内存泄露问题存在,用再大的内存也是没用


简单的解决方式就是调整堆的大小
在Eclilpse中修改启动参数,在VM arguments 加入了-Xms384m -Xmx384m
或者
在tomcat的catalina.bat中加上-Xms384m -Xmx384m

不过,建议最好再检查检查代码


不同意 @方正 的意见,也看到过很多人一发生 OOM 就开始改动堆内存的大小,而且调整堆内存也未必是越大越好。

首先普及一下知识:

建议按照如下的方式进行分析,解决问题:

1.直接检查代码是否有问题,看看是否有死循环、集合未释放元素引用等内存泄露问题。

2.设置 JVM 参数 -XX:+HeapDumpOutOfMemoryError-XX:HeapDumpPath=<你的path>

3.采用内存映像分析工具(http://www.eclipse.org/mat/),分析到底是内存泄露还是内存溢出,内存泄露的情况下,找找泄露对象怎样和GC ROOTS 关联的,进而找到泄露代码的位置。

4.如果不存在内存泄露,结合机器的物理内存,看看是否还可以继续调大堆内存 (-Xms 和-Xmx),这里也注意一下,并不是堆内存设置的越大越好,因为很大的内存发生 FULL GC 的时候,会发送很长时间的 "stop the world",这也不能接受的


@letcheng 同意它的观点,你只是一个纯java项目,又不是web项目,你能创建多少对象,搞到堆发生OOM。所以,很大程度上还是你代码的原因。
JDK下,有自带的JConsole.exe工具,你可以观察下你当前有多少对象,堆内存有多少,是在什么时候多到发生OOM的呢。

【热门文章】
【热门文章】