Java Memory" Leak"使用ConcurrentLinkedQueue $ Node

时间:2014-04-24 18:13:45

标签: java memory-leaks heap-dump

我有一个有趣的困境,我似乎有内存泄漏(或不断增长的数据结构)。当我分析我的内存使用情况时,我得到了典型的“随时间线性提升”图表。试图找出问题的原因是什么,我做了一个堆转储。我发现超过50%的内存被分配给ConcurrentLinkedQueue node。记忆的最大消费者是com.singularity.ee.agent.util.chjava.util.concurrent.ConcurrentLinkedQueue$Node,如下图所示。

enter image description here

我不知道util.ch是什么,但它似乎与节点绑定,因为每个ch都有一个节点的立即引用,所以不用担心这一点。

现在尝试查找对$ Node最近的GC的引用,我得到以下结果:

enter image description here

奇怪的是,它没有ConcurrentLinkedQueue $ Node,甚至没有ConcurrentLinkedQueue作为父级。所有引用都是我不理解的奇怪类型,kh, uc, z, g, etc.有谁知道这些类型是什么?

我试图找出导致问题的确切原因,但我无法找到这些节点甚至是如何创建/保存的。

这是踢球者:我不在代码中的任何地方使用ConcurrentLinkedQueue。我确实使用了ConcurrentHashMap,但是没有很多HashMap $ Node,所以不应该是问题。

有没有人对如何创建这些节点或为什么我有这么多实例有任何想法?

回答依赖性问题:我正在运行tomcat 6,java 6,Java Spring。

2 个答案:

答案 0 :(得分:1)

原来我从AppDynamics获得了一些专有代码导致了这个问题。我和他们开了一张票,他们在下一个版本中解决了这个问题。谢谢你的帮助!

答案 1 :(得分:0)

从您的评论中,由于其引用* .util.ch类的链接列表,您可以查找与ConcurrentLinkedQueue以及* .util.ch类相关的jar。

一旦识别出jar,那么取决于包含的类是内部构建还是第三方jar,您可以检查是否可以修复泄漏或是否有可用的修复。

关于如何确定依赖关系,看看这是否有帮助 - Find all dependencies in a Java class

除非使用反射,否则应该很容易找到类(因此包含jar)。如果有可能使用反射,那么提取罐子并尝试做一个包含'搜索所有* .class文件。

PS:如果已找到解决方案,请注明!