2009-08-06 51 views
4

我有一个Java应用程序正在泄漏内存。我知道哪些对象在垃圾回收期间没有被释放,但我无法弄清楚引用它们的是什么。是否有可能为垃圾收集“查看”对象图?

是否有可能对由JVM内部保存的对象图有某种可见性?

这是否可能找出哪些对象正在引用另一个对象?

+0

为什么你不能引用他们,当你知道他们是什么对象? – 2009-08-06 12:57:44

+0

这是一个J2ME应用程序。模拟器的内存分析器告诉我,当只有1个时,有2个类的实例。不幸的是,它没有告诉我更多。 – izb 2009-08-06 13:55:56

回答

4

在一个非常基础的层面上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理 - 它会在本地端口上启动一个小型Web服务器。阅读起来并不容易,但你不必购买一个分析器来使用它。

+0

哇。棒极了。 – izb 2009-08-06 13:46:25

1

Profiler这样做。例如,JProfiler。回到当天我使用Optimizeit(现在似乎已经死了)。

结论是,听众正在被传递给某个收藏,而不是从收藏中移除。监听器是在Frame或引用Frame的相应控件类上定义的匿名内部类,匿名内部类具有对其外部类的隐式引用。所以那个小听众把整个框架和所有伴随物体都放在主动记忆中。