堆转储根类

4
我们的生产系统陷入了无限循环的full gc和内存下降,仅在2分钟内就从8 GB降至1 MB。
在获取堆转储后,它告诉我有一个java.lang.Object数组([Ljava.lang.Object),其中包含数百万个具有相同字符串的java.lang.String对象,占用了99%的堆。
但是它没有告诉我哪个类引用了这个数组,以便我可以在代码中修复它。
我使用JDK 6上的jmap工具进行了堆转储,并使用了JProfiler、NetBeans、SAP Memory Analyzer和IBM Memory Analyzer,但这些工具都没有告诉我是什么原因导致了这个巨大的对象数组?像是哪个类引用了它或包含了它。
我需要使用不同的配置获取不同的转储来获取这些信息吗?还是有其他任何方法可以帮助我找到导致这个问题的罪犯类...这将会非常有帮助。
3个回答

3

我使用了YourKit并将其附加到生产节点之一,成功获取了带有引用的完整堆转储。感谢您的建议。 - Adnan Memon

1
我以前使用过 Eclipse Memory Analyzer来解决这样的问题。通常情况下,如果问题很简单,找到罪魁祸首就相当容易,但需要一些时间来熟悉术语。如果没有实际的转储文件,我无法告诉你可能是什么原因导致了这个问题。也许你应该查看这个字符串实际包含了什么内容,它是从哪里来的?

0

你尝试过直接在源代码和类文件中使用grep查找这个字符串吗?


是的,但它是一些输入值正在传递。 - Adnan Memon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接