Java 查看如何收集垃圾
我正在开发和优化一个Android应用程序 Eclipse内存分析器工具(MAT)非常适合查看哪些对象没有被垃圾收集,并修补这些内存泄漏,但我想知道的是相反的: 如何查看正在进行垃圾收集的对象? 我对保留什么不感兴趣 我为什么要这么做?我在后台线程的无限循环中运行一些东西。事情发生得很快,垃圾收集经常被调用。 我没有看到任何内存泄漏,但可能是因为发生了很多事情,Android决定调用了几百个命令。。。现在是运行垃圾收集的好时机强> 它可以收集一些正常的东西,比如一些超出范围的字符串或intJava 查看如何收集垃圾,java,android,Java,Android,我正在开发和优化一个Android应用程序 Eclipse内存分析器工具(MAT)非常适合查看哪些对象没有被垃圾收集,并修补这些内存泄漏,但我想知道的是相反的: 如何查看正在进行垃圾收集的对象? 我对保留什么不感兴趣 我为什么要这么做?我在后台线程的无限循环中运行一些东西。事情发生得很快,垃圾收集经常被调用。 我没有看到任何内存泄漏,但可能是因为发生了很多事情,Android决定调用了几百个命令。。。现在是运行垃圾收集的好时机 它可以收集一些正常的东西,比如一些超出范围的字符串或int 为了实现
为了实现我的目标,我想通过减少我正在创建的对象的数量来尽可能地防止垃圾收集延迟,但是知道频繁收集的是什么会很有用。然后,我可以首先尝试阻止创建经常收集的对象,或者保留这些对象,以便在不经常重新创建的情况下重用它们。这是不可能的,因为JVM通常不知道(或关心)GC期间删除的对象 事实上,GC并没有真正“收集”垃圾。它实际上是以相反的方式工作的,通过以下引用确定哪些对象是活动的,从堆根开始(例如线程拥有的本地引用)
仅保留此堆遍历期间遇到的对象。在漫游过程中看不到的任何内容都将被忽略,并且不会复制/压缩。这些剩余内容是有效“收集”的垃圾,但JVM不知道或不关心这些对象是什么。通过查看循环代码可能更容易确定这一点。在这些情况下,对象的生存时间和可见性至关重要。可能会发布相关代码,特别是显示变量的声明、初始化和赋值发生的位置。使用堆栈而不是堆也是一个值得追求的目标,因为当范围发生变化时,堆栈将被丢弃。另外,使用StringBuilder而不是string,小心装箱/拆箱等等。这并不能回答问题,但这是有效和有用的建议。我已经做了一些测试,但是垃圾收集的内容似乎不在我自己的代码中,而是在另一个库中或Android系统本身中,因此了解发生了什么是很有用的。