2009-09-08 53 views
4

我们有生产系统进入无限循环全gc和内存下降形式8演出喜欢1 MB在短短的2分钟。堆转储根类

堆转储后它告诉我有一个java.lang.Object([Ljava.lang.Object)数组与数百万java.lang.String对象具有相同的字符串占99%的堆。

但它不告诉我哪个类引用了这个数组,以便我可以在代码中修复它。

我在JDK 6上使用jmap工具进行了堆转储,并使用了JProfiler,NetBeans,SAP Memory Analyzer和IBM Memory Analyzer,但没有人告诉我是什么导致了这个巨大的数组对象? ...就像什么类引用它或包含它。

为了得到这些信息,我需要使用不同配置的不同转储吗? ......或者其他任何能够帮助我找出造成这一现象的罪魁祸首......这将有很大帮助。

回答

3

我以前使用过SAP内存分析器,它是一款非常棒的工具,可以找到“贪婪的内存猪”。

也许以下介绍可以帮助:Effective Java Heap Memory Analysis on Enterprise-Scale

+0

我使用YourKit并将其连接到其中一个生产节点,并且能够使用引用获得完整的堆转储。 Thx建议。 – 2009-09-12 02:06:57

0

你是否试图通过源和类简单地grep这个字符串?

+0

是的..但它的一些输入值被传递。 – 2009-09-12 02:07:29

1

我以前用Eclipse Memory Analyzer来找到这样的问题。通常,当它直截了当时,找到罪魁祸首相当容易,但需要一些习惯这些术语。如果没有实际的转储,我不能告诉你什么可能导致这个问题。也许你应该看看这个字符串实际上包含什么,它来自哪里?