我发现什么样的物体导致内存泄漏,现在是什么?

时间:2011-01-07 20:39:08

标签: java memory-leaks profiler jmap

在正在运行的进程上使用jmap -histo命令,每隔30分钟左右,我发现一种显然是内存泄漏的对象(在桌面应用程序中)。

负责泄漏的对象( Ie 唯一一种实例数量随时间增长且数量巨大的对象)是 int [] 。< / p>

我怀疑BufferedImage是罪魁祸首,但我不确定(我非常关心冲洗/取消BufferedImage但我仍然认为这是泄漏的原因。)

但是我也在程序的另一部分中使用int [],我只是不确定泄漏的来源。 jmap -histo的输出有点太“瘦”了。

我现在如何确定int[]的泄漏位置。

顺便说一下,我想指出一个简单的jmap -histo有多么伟大:我确信很多对象只是看到实例的数量和使用的内存足以发现漏洞,无需进一步分析。

但在我的情况下,我需要别的东西。

我的问题不是什么样的工具可以发现泄漏。我的问题是:

知道我的应用程序(或我的应用程序正在使用的API)正在泄漏 int [] ,我可以采取哪些步骤(例如,使用您最喜欢的探查器),希望找到泄漏?

该工具必须在Java 1.5 OS X 10.4 Apple JVM上运行。

2 个答案:

答案 0 :(得分:1)

您需要通过“保留堆”对对象进行排序。你会很快找到包含所有int []的有意义的对象/类。

答案 1 :(得分:1)

我建议首先使用Eclipse MAT,因为我个人不知道jProfiler的功能。然后,当您加载堆转储时,您可以检查一些int []的传入引用。你可以精确创建数组的引脚点,看看哪个持有类真正创造了大量数据。