如何在webapp中调试OutOfMemoryException

时间:2012-10-03 17:10:20

标签: java performance spring java-ee out-of-memory

我正在尝试调试内存不足错误。当我使用Jmap进行堆转储并使用eclipse Mat分析结果时 - 我看到以下内容。

7,677 instances of "java.lang.Class", loaded by 
"<system class loader>" occupy 48,094,720 (23.99%) bytes. 

最大的实例:

class blah.BlahService$$EnhancerByCGLIB$$4a0a7d43 @ 0x2aaab06d9668 
- 2,067,096 (1.03%) bytes. 

BlahService是一个带有@Service注释的spring服务。春天的所有服务类都是Singleton - 每个IOC每个bean一个 - 所以为什么这个类会成为最重要的嫌疑人。

我也看到了

One instance of "org.apache.jasper.servlet.JspServlet" loaded by 
"org.apache.catalina.loader.StandardClassLoader @ 0x2aaac17bc260" occupies 42,724,168 
(21.31%) bytes. The memory is accumulated in one instance of 
"java.util.concurrent.ConcurrentHashMap$Segment[]" loaded by "<system class loader>".
这是什么意思?

3 个答案:

答案 0 :(得分:1)

OutOfMemoryError通常表示以下两个问题之一: 1.你的内存太少,无法满足你的应用需求。然后,您需要使用Xmx启动参数增加服务器的堆大小 2.或者您的应用程序或其使用的第三方库中存在内存泄漏。没有先前的经验,跟踪内存泄漏并不是一件容易的事。我可以推荐Plumbr。它非常易于使用,也是监控内存泄漏的精确工具。

答案 1 :(得分:0)

是的,这个错误播出时为什么要做一些修复它的时候已经太晚了,因为一旦堆被填满,JVM根本无法做任何事情,因为它无法创建对象来做某事,另一方面,因为你正在使用Spring,我猜你正在做一个Web系统,在这种情况下你所要做的就是在deploy命令的开头提供更多的堆空间(就像'-Xms:256'那样)并且已经计划好了你的应用需要多少资源,因为这是事实,如果内存被填满,系统将会崩溃

答案 2 :(得分:0)

我使用过java分析器,但我对实际性能调整和内存使用的输出不满意,目前我们已经切换到java melody。这不仅有助于开发人员的性能优化,还有助于生产系统。 Java melody非常易于集成和配置,在生产中,您只需更新web.xml即可启用或禁用