我正在开发和优化Android应用程序。
Eclipse内存分析器工具(MAT)非常适合查看哪些对象不被垃圾收集,以及修补这些内存泄漏但我想知道的是相反的:
如何查看哪些对象被垃圾收集? 我对保留的内容不感兴趣。
为什么我要这样做?好吧,我在后台线程的无限循环中运行一些东西。东西发生得非常快,并且经常调用垃圾收集。 我没有看到任何内存泄漏,但也许是因为发生了很多事情,Android决定调用 几百条命令......现在是运行垃圾的好时机集合!的
例如,它可能正在收集一些正常的东西,例如一些超出范围的字符串或整数。对于我的目标,我想通过减少我创建的对象的数量来尽可能地防止垃圾收集滞后,但是知道经常收集的内容会很有用。然后,我可以尝试防止首先创建经常收集的对象,或者保留这些对象,以便可以重复使用它们而不经常重新创建。
答案 0 :(得分:0)
这是不可能的,因为JVM通常不知道(或关心)在GC期间删除了哪些对象。
事实上,GC并没有真正“收集”垃圾。它实际上以相反的方式工作,从堆根开始通过跟随引用来确定哪些对象是活的(例如,线程拥有的本地引用)。
仅保留在此堆散步期间遇到的对象。在步行期间未看到的任何内容都将被忽略,不会被复制/压缩。这些剩菜是有效“收集”的垃圾,但JVM不知道或不关心这些对象是什么。