我有一个有趣的困境,我似乎有内存泄漏(或不断增长的数据结构)。当我分析我的内存使用情况时,我得到了典型的“随时间线性提升”图表。试图找出问题的原因是什么,我做了一个堆转储。我发现超过50%的内存被分配给ConcurrentLinkedQueue node
。记忆的最大消费者是com.singularity.ee.agent.util.ch
和java.util.concurrent.ConcurrentLinkedQueue$Node
,如下图所示。
我不知道util.ch
是什么,但它似乎与节点绑定,因为每个ch都有一个节点的立即引用,所以不用担心这一点。
现在尝试查找对$ Node最近的GC的引用,我得到以下结果:
奇怪的是,它没有ConcurrentLinkedQueue $ Node,甚至没有ConcurrentLinkedQueue作为父级。所有引用都是我不理解的奇怪类型,kh, uc, z, g, etc.
有谁知道这些类型是什么?
我试图找出导致问题的确切原因,但我无法找到这些节点甚至是如何创建/保存的。
这是踢球者:我不在代码中的任何地方使用ConcurrentLinkedQueue。我确实使用了ConcurrentHashMap,但是没有很多HashMap $ Node,所以不应该是问题。
有没有人对如何创建这些节点或为什么我有这么多实例有任何想法?
回答依赖性问题:我正在运行tomcat 6,java 6,Java Spring。
答案 0 :(得分:1)
原来我从AppDynamics获得了一些专有代码导致了这个问题。我和他们开了一张票,他们在下一个版本中解决了这个问题。谢谢你的帮助!
答案 1 :(得分:0)
从您的评论中,由于其引用* .util.ch类的链接列表,您可以查找与ConcurrentLinkedQueue以及* .util.ch类相关的jar。
一旦识别出jar,那么取决于包含的类是内部构建还是第三方jar,您可以检查是否可以修复泄漏或是否有可用的修复。
关于如何确定依赖关系,看看这是否有帮助 - Find all dependencies in a Java class
除非使用反射,否则应该很容易找到类(因此包含jar)。如果有可能使用反射,那么提取罐子并尝试做一个包含'搜索所有* .class文件。
PS:如果已找到解决方案,请注明!