【问题标题】:Is it good practice to call GC in onPause() method?在 onPause() 方法中调用 GC 是一种好习惯吗?
【发布时间】:2013-02-07 07:21:04
【问题描述】:

显式调用 GC 对系统内存有影响吗?

我在我的活动中使用了许多数据结构,例如 ArraylistHashMap。每次用户加载活动时,都需要重新填充来自 Web 服务的更新数据。这意味着当用户离开活动并再次回来时,这些数据结构应该进入内存。

当用户离开 Activity 并且不再访问它时,我不希望这些数据结构占用任何内存。

那么可以通过在activity的onPause()中调用GC来执行吗?这样做是个好习惯吗?如果我想做这样的事情,有哪些选择?

【问题讨论】:

  • 不,这不是一个好习惯,您正在强制虚拟机进行垃圾收集。让 vm 完成它的工作。

标签: android android-memory


【解决方案1】:

首先,System.gc() 只是一个请求。无法保证系统会运行垃圾收集器。

接下来,谈谈您的问题。如果您确定该活动将退出并重新创建以进行数据更新,则最好将当前活动中的所有数据结构分配给NULL

这你可以在你的 onDestroy() 方法中完成。这将确保您的所有 DS 对象都被释放,并且系统在运行 gc() 时会考虑进行垃圾收集。

希望这会有所帮助。

【讨论】:

  • 同意你的回答,但我想要的是活动中占用的内存应该在我离开后立即回收。在我的应用程序的其他部分实际上需要内存,但正如你所说没有保证系统会在我离开我的活动后立即回收它。简而言之,我想调用垃圾收集器来调用一些活动。你对此有什么想法吗?
  • 另一件事是,如果你给任何东西分配空引用,它会占用内存,因为空是空白引用。如果你运行的是 64 位机器,它会占用 8 字节的内存。所以分配真的很好吗对所有对象都为 null。
  • 系统在意识到内存运行时运行垃圾收集器。因此,大多数时候,您不必担心内存问题。您需要集中精力,在完成所有 DS 对象后释放它们。
  • 另外,将所有“不再需要”的对象设置为 NULL 是编程中的一种更好的做法。
【解决方案2】:

您应该首先调用 clear 所有数据结构并将它们设置为 null。 调用 GC 可能会降低设备性能和对垃圾收集器的请求,不确定是否会执行 GC。

所以,与其自己调用 GC,不如清除所有 DS 并将它们设置为 null。

【讨论】:

猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多