2014-01-30 38 views
2

我試圖提高我的Android應用程序的性能,並且我已經總結出至少一些問題在於垃圾收集過多。我可以使用堆工具來查看分配的內容,但很高興看到什麼是垃圾收集GC期間釋放了什麼?

有什麼方法可以告訴Java GC中哪些對象被釋放了?股票工具可能嗎?有第三方工具嗎?

+0

[PhantomReferences](http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html)用於跟蹤對象是否爲GC。您將無法檢索將要使用PhantomReferences收集的實際對象,因此您需要自己跟蹤對象。而且,當PhantomReference設置爲null或丟失其引用時,該對象僅爲GC。也許[這個例子](https://github.com/RovoMe/PluginApplication/blob/unstable/PluginFramework/PluginCore/src/main/java/at/rovo/core/injection/InjectionControllerImpl.java)幫助 –

+1

在我的腦海裏:你可以重寫你感興趣的類的'finalize()'方法。添加一些記錄對象獲得gc'd的事實的函數。 (通過使用適當的分析工具,可能有一些更好的方法來做到這一點)。 –

+1

@MartijnCourteaux'finalize()'承擔回收將要被GCed的對象並因此阻止對象的實際GC的危險。 PhantomReferences不允許這樣做,但是如果有人保持對PR的引用存在,這也會阻止GC。 –

回答

2

您可以通過捕獲「之前」和「之後」堆轉儲,並計算差異來做到這一點。

的基本問題,使這個硬盤是GC沒有決定丟棄,它決定什麼什麼保持,所以它不是真正走向釋放的對象的聚會名單爲目標。在某些實現中,可能不會有每個對象放棄操作。 (想象一下,每個存儲頁面都有一張表格,在GC開始時,將所有位設置爲零,對於每個保存的對象,將其接觸的頁面上的位設置爲1 。完成後,任何帶有零位的頁面都是免費的,可用於新的分配。)

您可以使用終結器和幻像引用爲您創建的對象播放一些遊戲,但並非所有堆對象。