【问题标题】:Memory leaks after finishing activity完成活动后内存泄漏
【发布时间】:2013-08-14 23:30:42
【问题描述】:

我认为我的应用程序中的一些活动正在泄漏内存。我试过以下: 活动 A 是启动器活动,占用约 23.5MB 总内存(dalvik+native)。 当我从 A 开始活动 B 时,我的应用程序需要大约 4 MB (~27,5MB)。如果我从 A 开始活动 C,我的应用程序也需要大约 4 MB (~27,5MB)。因此,如果我开始这两个活动,大约需要 7 MB(~30,5MB)。 现在我正在做以下事情: A->从A开始B->从B开始C->完成B。另外占用的预期内存量约为4MB(~27,5MB),但我的应用程序实际上总共消耗了7MB(~30, 5MB)。为什么会这样?

谢谢和问候

PS:我正在使用 Little Eye 来分析我的应用程序的内存使用情况。所有数据都代表总内存值(dalvik + native)。 如果我只是执行 A->从 A-> 完成 B,则在第 3 步之后不会释放内存。

【问题讨论】:

  • 使用 MAT 来识别实际的内存泄漏。

标签: android memory memory-management memory-leaks android-activity


【解决方案1】:

您不能强制垃圾收集器以任何方式收集内存。 finish() 只是告诉系统活动已经完成,结果可以传播回来。

http://developer.android.com/reference/android/app/Activity.html#finish%28%29

尝试使用 System.gc() 强制垃圾收集器,但同样,这并不能保证即使不存在对对象的活动引用也会对内存进行垃圾收集。 试试看这里:

http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

此外,垃圾收集环境中的内存泄漏意味着无法对对象进行垃圾收集,因为挂起的引用仍然指向它。如果这可能是您的情况,请尝试使用 Eclipse 插件 MAT。

【讨论】:

  • 但是我如何才能确定这是内存泄漏问题还是只是未收集的内存问题?我应该这样做吗:'A->堆转储h1->从A开始B->完成B->堆转储h2'然后将h2与h1进行比较。我可以说,如果实例过多,内存就会泄漏,如果没有,内存还没有被垃圾回收?
  • 使用 MAT 查看哪些对象在不应该有活动引用时具有活动引用。这会为您识别内存泄漏。有很多方法可以提高内存使用率,而 MAT 是帮助您实现这一目标的工具之一。研究一些关于 profiling 的参考资料并尝试一下。
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多