2009-08-06 84 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的相應控件類上定義的匿名內部類,匿名內部類具有對其外部類的隱式引用。所以那個小聽衆把整個框架和所有伴隨物體都放在主動記憶中。