我们上周在生产环境中遇到了内存不足的错误。这种内存不足错误可能每周发生一次,当前的解决方法是重新启动应用程序服务器。我们正在使用glassfish 3.0.1。生成的堆转储大约为5GB。
请帮助分析下面的堆转储。这是使用eclipse MAT生成的泄漏嫌疑人报告。我们如何分析以下报告?
One instance of
"com.sun.enterprise.v3.services.impl.monitor.stats.ConnectionQueueStatsProvider" loaded by
"org.apache.felix.framework.ModuleImpl$ModuleClassLoader @ 0x602650970" occupies
2,104,143,312 (87.97%) bytes. The instance is referenced by
org.glassfish.flashlight.impl.client.ReflectiveClientInvoker @ 0x600a63768 , loaded by
"org.apache.felix.framework.ModuleImpl$ModuleClassLoader @ 0x60265dd38". The memory is
accumulated in one instance of "java.util.concurrent.ConcurrentHashMap$Segment[]" loaded
by "<system class loader>".
Keywords
org.apache.felix.framework.ModuleImpl$ModuleClassLoader @ 0x602650970
org.apache.felix.framework.ModuleImpl$ModuleClassLoader @ 0x60265dd38
java.util.concurrent.ConcurrentHashMap$Segment[]
com.sun.enterprise.v3.services.impl.monitor.stats.ConnectionQueueStatsProvider
答案 0 :(得分:0)
请检查您的函数调用流,因为您没有关闭一旦打开创建内存泄漏的数据库连接
请参阅此对话以获取进一步的参考Database connections and OutOfMemoryError: Java Heap Space
答案 1 :(得分:0)
很难用这么少的信息分析原因。
根据该报告,它可能是数据库连接问题。
TRY:
确认ConnectionQueueStatsProvider
所持有的内容(可能是java.util.concurrent.ConcurrentHashMap $ Segment [])。
打开源代码,找出ConnectionQueueStatsProvider's ConcurrentHashMap
中的内容。
如果java.util.concurrent.ConcurrentHashMap $ Segment []标记了大部分空间,那么你的应用可能会遇到数据库连接问题。
66 private final Map<Integer, Long> openConnectionsCount = new ConcurrentHashMap<Integer, Long>();
尝试检查代码并关闭数据库连接。
答案 2 :(得分:0)
嗯,MAT在这里非常明显。您有一个ConnectionQueueStatsProvider实例,它有一个巨大的openConnectionsCount映射。看来你不断填写这张地图,但绝不会从中删除任何东西。如果我看过一个内存泄漏:)
将来,您可能会对Plumbr感兴趣,{{3}}是为了找到这些问题而创建的,只需要更少的工作量。
答案 3 :(得分:0)
我们认为我们找到了答案。我们在glassfish jira中看到了一个类似的错误:https://java.net/jira/browse/GLASSFISH-16254。这似乎是glassfish 3.0.1的一个错误。
当启用了线程池和http服务的glassfish监视时,它们出现内存不足错误,这是我们的确切设置。
我们关闭了玻璃鱼监测,现在我们运行稳定1周,没有任何内存不足。
感谢大家的帮助!