android中的垃圾收集(手动完成)

Posted

技术标签:

【中文标题】android中的垃圾收集(手动完成)【英文标题】:Garbage Collection in android (Done manually) 【发布时间】:2011-12-31 22:39:58 【问题描述】:

我有一个奇怪的疑问。我知道垃圾收集器有其自身的局限性。如果分配是 那么它可能会导致应用程序以不寻常的方式响应问题。

所以我的问题是,在每个活动结束时强制调用垃圾收集器 (System.gc()) 是一种良好的编程习惯吗?

更新

每个人都说调用 system.gc() 根本没有好处。然后我想知道为什么它会出现在这里。DVM 将决定何时运行垃圾收集器。那么该方法需要什么?

更新 2

感谢社区帮助我。但老实说,我从这个链接Java Performance Optimization

【问题讨论】:

我不这么认为,如果你的应用程序缺乏性能应该是别的东西,除非你分配了大量的数据。是这样吗? 需要system.gc()方法***.com/questions/3117429/… @Ic2817 仔细阅读问题。我没有说我的应用程序的行为是这样的。我正在讨论 system.gc() 的存在 【参考方案1】:

在每个活动结束时强制调用垃圾收集器(System.gc())不是良好的编程习惯

因为它没用,只有 DVM 决定什么时候应该调用它,尽管你调用它......

【讨论】:

感谢大家的快速响应。如果我在每次活动后都调用它,那么它将如何工作。 这会帮助你chaoticjava.com/posts/how-does-garbage-collection-work 是的thanx ..但它会给谁,谁想在java中读取垃圾收集。但我想知道如果一切都由DVM决定,为什么system.gc()存在于此 使用system.gc()方法***.com/questions/3117429/…【参考方案2】:

System.gc(),VM 有时会随心所欲地忽略它,在以下两种情况下最有用:

    您正在吞噬内存,就像没有明天一样(通常使用位图)。 您怀疑存在内存泄漏(例如意外持有旧的 Context),并希望将 VM 内存置于静止状态以查看内存使用量是否在攀升以进行调试。

在名义上的情况下,不应该使用它。

【讨论】:

【参考方案3】:

我真的认为这取决于你的情况。

因为堆是分代的,GC 可能不会在第一次通过时摆脱某些大对象或位图,并且它的启发式可能不会指示额外的垃圾收集是必要的,但肯定存在启发式可能错误的场景,并且我们作为开发人员了解某种模式,或者可以预测 GC 无法预测的用法,因此调用 system.gc() 将使我们受益。

我之前在特定场景中看到过这种情况,例如处理地图平铺或其他图形密集型行为,其中 android 中的本机 GC(即使在 3.0+ 设备上)无法正确处理,导致内存不足错误.但是,通过添加一些 GC 调用,可以防止 Out of Memory 错误,并且系统会继续处理,尽管速度较慢(由于垃圾收集)。在图形密集型操作中,这通常是应用程序崩溃所需的状态(有点滞后),因为它无法将额外的资源加载到内存中。

对于为什么在某些情况下会发生这种情况,我唯一的解释似乎是时机。如果用户操作很慢,那么原生 Android GC 似乎做得很好。但是,如果您的用户快速滚动或快速缩放,这就是我看到 Android GC 落后的地方,并且一些经过深思熟虑的 System.gc() 导致我的应用程序没有崩溃。

【讨论】:

【参考方案4】:

致电System.gc(),不会造成任何伤害。但你不能确定它会有用。因为您要求 DVM 进行垃圾收集,但不能命令 它...它完全依赖于DVM。它在内存用完或可能随时调用时调用..

【讨论】:

【参考方案5】:

Patrick Dubroy 在 Google IO 2011 上发表了关于内存管理的会议。值得一看,因为他讨论了堆分配和 GC 的工作。你可以看这里Memory Management

【讨论】:

【参考方案6】:

我尝试将 System.gc() 放在我在 Android 应用程序中创建位图的行之前。在某些情况下,垃圾收集器释放了几兆字节,并结束了我的 OutOfMemoryError 条件。它并没有干扰正常的垃圾收集,但它确实让我的应用运行得更快。

【讨论】:

好的..我对 system.gc() 的存在有了一些了解。但是让它为未来的最佳答案开放。然后我会接受其中一个作为答案。但是为你的努力投票【参考方案7】:

没有;如果系统需要内存,它会自己调用GC。

当实例消失时,实例使用的任何未在其他任何地方引用的内存都将符合 GC 条件。

实例本身使用的内存,如果不再被引用,也符合 GC 条件。您可以进行代码审查或分析,看看您是否不必要地保留了内存,但这是一个不同的问题。

【讨论】:

那为什么 system.gc() 存在? @Sameer 询问原始 Java 工程师。我假设您可以向系统提供提示,但它的行为取决于实现。你知道你在一年前问过这个问题,对吧? 是的,我在一年前问过这个问题。但我仍然不确定 System.gc() 的使用。所以我假设它提示 JVM 运行垃圾收集器(正如你刚才所说)但不能强制 JVM【参考方案8】:

手动调用GC一个不好的编码习惯...

Developer docs on RAM usage 状态:

...GC_EXPLICIT

显式 GC,例如当您调用 gc() 时(您应该避免调用,而是信任 GC 在需要时运行)。

...

我在这里用粗体突出了最重要和最相关的部分。

【讨论】:

以上是关于android中的垃圾收集(手动完成)的主要内容,如果未能解决你的问题,请参考以下文章

嵌套循环导致android中的大量垃圾收集?

我是否必须在Java中手动实现垃圾收集?

标记为垃圾收集vs符合java中的垃圾收集条件

从pyspark手动调用spark的垃圾收集

Java垃圾收集机制

Java虚拟机浅谈——垃圾收集器与内存分配策略