我有一个泄漏内存的Java应用程序。我知道在垃圾收集过程中哪些对象没有被释放,但我无法弄清楚引用它们的是什么。
是否可以对JVM内部保存的对象图具有某种可见性?
在任何情况下都可以找出哪些对象引用了另一个对象?
答案 0 :(得分:4)
在一个非常基础的层面上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理 - 它会在本地端口上启动一个小型Web服务器。它并不容易阅读,但您不必购买分析器来使用它。
答案 1 :(得分:1)
Profilers这样做。例如JProfiler。在那天我使用了Optimizeit(现在似乎已经死了)。
结论是,听众被传递到某个集合,而不是从该集合中删除。侦听器是在Frame或引用Frame的相应控件类上定义的匿名内部类,而匿名内部类具有对其外部类的隐式引用。因此,小听众将整个框架及其所有伴随对象保持在活动记忆中。