Android手动解除分配对象

时间:2011-08-24 03:12:51

标签: android memory allocation

我已阅读Android的设计性能开发者指南。

我只是想知道,如果我有一个大型对象,我无法避免创建(这是昂贵的),当我知道我已经完成它时,我想立即解除分配似乎是合乎逻辑的。

似乎无法做到这一点。

有人建议将其设置为null,以便系统立即使用GC,这是否真的“立即”?因为如果系统(Dalvik VM)可以选择不释放我刚设置为null的大对象,那么将它设置为null根本不是解决方案。

将它设置为null是否会鼓励和加速GC是否正确?

这种方法是一种“足够好”的方式来优化Apps性能吗?或者是否值得加倍努力(如果可能的话),强制GC适用于任何Android设备的最佳性能?

2 个答案:

答案 0 :(得分:4)

我认为在执行GC时你不应该担心细粒度的细节,因为我们无法控制何时调用gc。即使调用gc()也不能保证集合。来自System.gc()

的每个文档
  

向虚拟机指示运行垃圾收集器是一个好时机。请注意,这只是一个提示。无法保证垃圾收集器实际运行。

在开发具有大对象分配的应用程序时,我会担心以下情况:

  1. 在分配大对象后,在退出该对象的生命周期范围后,我是否会在以后的活动中看到它被GC回收?通过使用adb shell运行dumpsys meminfo可以轻松检查这一点。你基本上在重新分配后进行检查,如果内存是正确的垃圾收集,通常表示大穗和随后丢弃
  2. 检查此大对象是否有明确的GC路径。您可以通过转储hprof来检查此对象的引用路径并在Memory Analyzer中进行检查。如果确实如此,那么您就很安全,因为GC足够聪明,可以收集。
  3. 分配这个大对象后,我的堆中是否有足够的填充来执行后续活动?如果对象太大,GC有可能没有足够的速度来收集它(这实际上与你的观点有关),后续活动的内存消耗加上前一个活动的剩余可能实际上导致了记忆错误。使用GC的清除路径设置null将有助于确保此对象适当地获得GC。我承认这是一个问题,但我认为如果这成为一个问题,我们可能需要重新审视这个特定部分的设计方式,看看我们是否可以对其进行任何优化。
  4. 根据需要通过onDestroy实现对活动的清理,并确保其他人不引用活动,以便可以正确地收集垃圾。例如:我们经常传递活动上下文,忘记它将保留其引用。在位图上调用recycle()之类的东西也应该有所帮助。记住这些要点应该有助于在#3发生的情况下准备更多的空间

答案 1 :(得分:2)

大部分时间android都能很好地处理垃圾回收。除非你开始收到OutOfMemoryError,否则我不担心。

但是如果你真的担心它,将对象设置为null然后调用System.gc()很可能会导致它被收集。