【问题标题】:Android: Is there any advantage of settings references to null when an Activity is being destroyed?Android:当 Activity 被销毁时,设置对 null 的引用有什么好处吗?
【发布时间】:2016-02-01 10:25:03
【问题描述】:

由于垃圾收集器使用 Mark-Sweep 算法:

实际的 GC 是使用 Mark-Sweep 算法完成的。这个做完了 使用位向量来跟踪最初可到达的对象 将根对象标记为可达。然后 GC 对 堆中的对象按地址顺序标记。对于每个可达 它扫过的对象 它标记从该对象可到达的所有对象 作为可达。如果新对象具有较低的地址,则将其添加到 工作队列。在初始扫描之后,工作队列是

所以它会通过每个对根有引用的对象,并且每个其他对象都会被收集。在任何情况下,在 Activity 上放置对 null 的引用是有用的吗?

穿上onDestroy 我认为没有优势对吗? 在“繁重”活动中将onPause(在验证isFinishing 之后)上的它们设置为null 怎么样。它会帮助更快地收集资源吗?

【问题讨论】:

  • 您可以查看以下链接,它传达了您正在寻找的内容stackoverflow.com/questions/850878/…
  • 当系统真的说它需要它时,为什么不从它的进程中删除不需要的内存呢?见Activity#onTrimMemory
  • @pskink 这不完全是用例。我说的是一个用例,当您有大量内存活动(ies)并且您出于任何原因销毁它(移动到另一个,旋转......)时,您希望它尽快成为 GC。
  • 如果您需要立即进行 GCd 处理,可能值得先了解一下为什么需要这么多内存。这几乎总是与位图相关,如果是这样,请查看developer.android.com/training/displaying-bitmaps/…
  • @Dori 这不是我当前遇到的问题,它只是一个理论上的用例,我认为了解最佳实践很有用.. 首先避免出现此类问题 :-)

标签: android garbage-collection


【解决方案1】:

所以它会通过每个对根有引用的对象,并且每个其他对象都将被收集。在任何情况下,在 Activity 上放置对 null 的引用是有用的吗?

是的。如果是static

穿上 onDestroy 我认为没有优势对吗?

我会说这可以忽略不计,因此毫无意义,因为 Activity 本身将暂时无 GC 根

...在“繁重”活动的 onPause 上将它们设置为 null 怎么样。是否有助于更快地收集资源?

如果一个对象没有 GC 根,它就有资格进行 GC。 OnPause 发生在onDestroy 之前的某个时间点(取决于执行情况,这可能是任何 时间范围)因此是 对上述问题。

但是!您不希望这样做,因为您的活动可能会在 onPause 之后回到前台,并且您将不得不再次分配所有“重”对象 - 这很可能最终给最终用户带来糟糕的体验。

【讨论】:

【解决方案2】:

通过使任何object = null,我们间接告诉垃圾收集不需要使用对象(使其符合垃圾收集条件)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多