【问题标题】:Android WeakReference not behaving as expectedAndroid WeakReference 未按预期运行
【发布时间】:2012-07-25 15:04:02
【问题描述】:

据我所知,根据规范(以及标准的非安卓)java,如果一个对象只是“弱引用”,即只能通过弱引用访问 - 它下次运行时由垃圾收集器收集。

在我的 android 应用中,由于某种原因,情况并非如此。

一个非常重的对象(Activity)每次创建时都留在堆中,但是当我执行堆转储并在 Eclipse 内存分析器中检查它时,我看到该对象仍然在堆中,即使它是只有弱引用(可以在合并路径到 GC 根选项中看到)

当我明确清除弱引用时,对象被清除。

我在 Android 2.3.3 上运行我的应用程序。它看起来像是某种平台错误。

我错过了什么吗? 有没有其他人遇到过这个问题?

谢谢, 约夫

【问题讨论】:

  • “我看到对象留在堆中”,什么样的对象?位图参考?
  • 一项活动。那只是弱引用。

标签: java android weak-references


【解决方案1】:

在下次运行时被垃圾收集器收集。

不,没有这样的保证。 可能会被收集。 (这适用于所有对象,无论引用类型如何,这就是为什么您经常读到一个对象成为“有资格收集”的原因。)

【讨论】:

  • 我收到 OutOfMemoryError 因为它从未被收集
  • 它与标准(非android)java所保证的不同吗?
  • 如果你得到OutOfMemoryErrors,我建议你使用SoftReference 而不是WeakReference。 Android 会在抛出 OutOfMemoryExceptions 之前尝试清除 SoftReferences,并且只有在无法清理足够空间时才会抛出错误。
  • 你是说android在之前 WeakReferences清除SoftReferences?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 2020-06-28
  • 2012-02-18
  • 2018-01-18
  • 2012-06-14
  • 2019-03-03
相关资源
最近更新 更多