繁体   English   中英

看看正在收集垃圾

[英]See what is getting garbage collected

我正在开发和优化Android应用程序。

Eclipse内存分析器工具(MAT)非常有用,它可以查看哪些对象没有被垃圾回收,并修补那些内存泄漏,但是我想知道的是相反的情况:

我如何查看正在收集哪些对象? 我对保留的内容不感兴趣。

我为什么要这样做? 好吧,我正在后台线程中无限循环地运行某些东西。 事物发生得非常快,垃圾回收经常被调用。 我看不到任何内存泄漏,但是也许是因为发生了很多事情,Android决定已经调用几百个命令……现在是运行垃圾回收的好时机!

例如,它可能正在收集一些正常的东西,例如一些超出范围的String或int。

对于我的目标,我想通过减少我正在创建的对象的数量来尝试尽可能地防止垃圾收集滞后,但是知道如此频繁地收集什么将很有用。 然后,我可以尝试避免首先收集经常收集的对象,或者保留这些对象,以便可以重复使用它们而无需经常重新创建。

这是不可能的,因为JVM通常不知道(或关心)在GC期间删除了哪些对象。

实际上,GC并没有真正“收集”垃圾。 它实际上以相反的方式工作,从堆根开始(例如,线程拥有的本地引用),通过遵循引用来确定哪些对象是活动的。

仅保留在此堆遍历过程中遇到的对象。 行走过程中看不到的任何东西都将被忽略,并且不会被复制/压缩。 这些残留物是有效地“收集”的垃圾,但是JVM不知道或不在乎那些对象是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM