ConnectionQueueStatsProvider 出现内存不足错误

Posted

技术标签:

【中文标题】ConnectionQueueStatsProvider 出现内存不足错误【英文标题】:Out of memory error with ConnectionQueueStatsProvider 【发布时间】:2013-12-02 04:46:51 【问题描述】:

上周我们在生产环境中遇到了内存不足错误。这种内存不足错误可能每周发生一次,当前的解决方法是重新启动应用程序服务器。我们正在使用 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

【问题讨论】:

【参考方案1】:

请检查您的函数调用流程,因为您没有关闭曾经打开的数据库连接,造成内存泄漏

请参阅此对话以获取更多参考Database connections and OutOfMemoryError: Java Heap Space

【讨论】:

嗨!您在哪里看到数据库连接是问题的原因? 可能不是数据库连接,数据库连接也会产生同样的问题,并且连接信息存储在 Hashmaps 中,所以这里也有一些连接被打开并且没有通过离开垃圾收集器正确关闭。所以检查那个观点【参考方案2】:

用这么少的信息很难分析原因。

根据报告,可能是数据库连接问题。

试一试:

确认ConnectionQueueStatsProvider(可能是java.util.concurrent.ConcurrentHashMap$Segment[])持有什么。

打开源代码,找出ConnectionQueueStatsProvider's ConcurrentHashMap中的内容。


如果java.util.concurrent.ConcurrentHashMap$Segment[] token占了大部分空间,你的app可能有db连接问题。

Java.util.concurrent.ConcurrentHashMap 只是 ConnectionQueueStatsProvider 的一种用法:

66 private final MapInteger, Long> openConnectionsCount = new ConcurrentHashMapLong>();

尝试检查您的代码并关闭数据库连接。

【讨论】:

【参考方案3】:

嗯,MAT 在这里很明显。您有一个 ConnectionQueueStatsProvider 实例,它有一个巨大的 openConnectionsCount 映射。似乎你不断地填充这张地图,但从不从中删除任何东西。如果我见过内存泄漏:)

将来,您可能会对Plumbr 感兴趣,它旨在以更少的工作量找到此类问题。

【讨论】:

【参考方案4】:

我们认为我们找到了答案。我们在 glassfish jira:https://java.net/jira/browse/GLASSFISH-16254 中看到了类似的错误。这似乎是 glassfish 3.0.1 的一个错误。

当 glassfish 监控线程池和 http 服务时出现内存不足错误,这正是我们的设置。

我们关闭了 glassfish 监控,现在我们可以稳定运行 1 周,没有任何内存不足。

感谢大家的帮助!

【讨论】:

以上是关于ConnectionQueueStatsProvider 出现内存不足错误的主要内容,如果未能解决你的问题,请参考以下文章