2

我正在尝试调试内存不足错误。当我使用 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 服务。所有服务类在春季都是单例的——每个 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>".

这是什么意思?

4

3 回答 3

1

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

于 2012-10-04T10:28:35.877 回答
0

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

于 2012-10-04T12:08:51.843 回答
0

是的,当修复它为时已晚时,该错误就会出现,因为一旦堆被填满,JVM就无法做任何事情,因为它无法创建对象来做某事,另一方面,因为你'重新使用 Spring 我猜你正在做一个 Web 系统,在这种情况下,你所要做的就是在 deploy 命令的开头提供更多的堆空间(它类似于'-Xms:256')并计划了多少资源将需要您的应用程序,因为这是一个事实,如果内存被填满,系统就会崩溃

于 2012-10-03T23:22:23.913 回答