不是web项目,纯java项目Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
学习是最好的投资!
不同意 @方正 的意见,也看到过很多人一发生 OOM 就开始改动堆内存的大小,而且调整堆内存也未必是越大越好。
首先普及一下知识:
堆内存分为新生代和老年代,新生代的用来存储经常要进行 GC 的对象,每个对象实例都会有个计数,都超过一定的时间仍未被 GC,就会晋升到老年代进行存储。
老年代会比新生代的空间大一些。
发生 OOM 都是老年代的内存不足(因为新生代的不足的情况下,会放到老年代进行存储)。
建议按照如下的方式进行分析,解决问题:
1.直接检查代码是否有问题,看看是否有死循环、集合未释放元素引用等内存泄露问题。
2.设置 JVM 参数 -XX:+HeapDumpOutOfMemoryError 和 -XX:HeapDumpPath=<你的path>
-XX:+HeapDumpOutOfMemoryError
-XX:HeapDumpPath=<你的path>
3.采用内存映像分析工具(http://www.eclipse.org/mat/),分析到底是内存泄露还是内存溢出,内存泄露的情况下,找找泄露对象怎样和GC ROOTS 关联的,进而找到泄露代码的位置。
4.如果不存在内存泄露,结合机器的物理内存,看看是否还可以继续调大堆内存 (-Xms 和-Xmx),这里也注意一下,并不是堆内存设置的越大越好,因为很大的内存发生 FULL GC 的时候,会发送很长时间的 "stop the world",这也不能接受的
简单的解决方式就是调整堆的大小在Eclilpse中修改启动参数,在VM arguments 加入了-Xms384m -Xmx384m或者在tomcat的catalina.bat中加上-Xms384m -Xmx384m
不过,建议最好再检查检查代码
@letcheng 同意它的观点,你只是一个纯java项目,又不是web项目,你能创建多少对象,搞到堆发生OOM。所以,很大程度上还是你代码的原因。JDK下,有自带的JConsole.exe工具,你可以观察下你当前有多少对象,堆内存有多少,是在什么时候多到发生OOM的呢。
这种问题,建议用findbug或者sonar等工具跑一下程序看看哪里有内存泄露导致内存溢出的风险
java.lang.OutOfMemoryError: Java heap space是堆内存的年轻年老态内存空间都用完时候就会抛,所以一般来说此问题主要是创建的内存无法回收,例如最常见的IO类用完后不做xx.close()
光是在TOMCAT配置大内存是不够了,需要找到源头,如果有内存泄露问题存在,用再大的内存也是没用
不同意 @方正 的意见,也看到过很多人一发生 OOM 就开始改动堆内存的大小,而且调整堆内存也未必是越大越好。
首先普及一下知识:
堆内存分为新生代和老年代,新生代的用来存储经常要进行 GC 的对象,每个对象实例都会有个计数,都超过一定的时间仍未被 GC,就会晋升到老年代进行存储。
老年代会比新生代的空间大一些。
发生 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",这也不能接受的
简单的解决方式就是调整堆的大小
在Eclilpse中修改启动参数,在VM arguments 加入了-Xms384m -Xmx384m
或者
在tomcat的catalina.bat中加上-Xms384m -Xmx384m
不过,建议最好再检查检查代码
@letcheng 同意它的观点,你只是一个纯java项目,又不是web项目,你能创建多少对象,搞到堆发生OOM。所以,很大程度上还是你代码的原因。
JDK下,有自带的JConsole.exe工具,你可以观察下你当前有多少对象,堆内存有多少,是在什么时候多到发生OOM的呢。
这种问题,建议用findbug或者sonar等工具跑一下程序看看哪里有内存泄露导致内存溢出的风险
java.lang.OutOfMemoryError: Java heap space是堆内存的年轻年老态内存空间都用完时候就会抛,所以一般来说此问题主要是创建的内存无法回收,例如最常见的IO类用完后不做xx.close()
光是在TOMCAT配置大内存是不够了,需要找到源头,如果有内存泄露问题存在,用再大的内存也是没用