Java GC期间释放了什么?

Java GC期间释放了什么?,java,android,performance,garbage-collection,Java,Android,Performance,Garbage Collection,我正在努力提高我的Android应用程序的性能,我得出的结论是,至少部分问题在于垃圾收集过多。我可以使用堆工具来查看分配了什么,但如果能看到垃圾被收集了,那就太好了 有没有办法告诉我们在JavaGC中释放了哪些对象?是否可以使用库存工具?是否有第三方工具可用于此目的?您可以通过捕获“之前”和“之后”堆转储并计算差异来实现此目的 使这一点变得困难的基本问题是,GC不决定丢弃什么,它决定保留什么,因此它实际上不适合收集已释放对象的列表。在某些实现中,可能没有每个对象放弃操作。(假设您有一个表,每个存

我正在努力提高我的Android应用程序的性能,我得出的结论是,至少部分问题在于垃圾收集过多。我可以使用堆工具来查看分配了什么,但如果能看到垃圾被收集了,那就太好了


有没有办法告诉我们在JavaGC中释放了哪些对象?是否可以使用库存工具?是否有第三方工具可用于此目的?

您可以通过捕获“之前”和“之后”堆转储并计算差异来实现此目的

使这一点变得困难的基本问题是,GC不决定丢弃什么,它决定保留什么,因此它实际上不适合收集已释放对象的列表。在某些实现中,可能没有每个对象放弃操作。(假设您有一个表,每个存储页都有一个位。在GC开始时,将所有位设置为零。对于您保留的每个对象,将它所接触的页上的位设置为1。完成后,任何具有零位的页都是空闲的,可以用于新的分配。)


您可以为创建的对象使用终结器和幻影引用来玩一些游戏,但对于所有堆对象没有等价物。

用于跟踪对象是否将成为GC。您将无法检索将使用PhantomReferences收集的实际对象,因此您需要自己跟踪这些对象。此外,只有当PhantomReference设置为null或自然丢失其引用时,对象才是GC。也许对我的大脑有帮助:你可以为你感兴趣的类重写
finalize()
方法。添加一些功能,记录对象获得gc'd的事实。(可能有一些更好的方法可以做到这一点,通过使用适当的分析工具)。@MartijnCourteaux
finalize()
有回收将要进行gcd的对象的危险,因此会阻止对象的实际GC。PhantomReferences不允许这样做,但是如果有人保持对PR的引用处于活动状态,这也会阻止GC。