在正在运行的进程上使用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上运行。
答案 0 :(得分:1)
您需要通过“保留堆”对对象进行排序。你会很快找到包含所有int []的有意义的对象/类。
答案 1 :(得分:1)
我建议首先使用Eclipse MAT,因为我个人不知道jProfiler的功能。然后,当您加载堆转储时,您可以检查一些int []的传入引用。你可以精确创建数组的引脚点,看看哪个持有类真正创造了大量数据。