【发布时间】:2013-12-27 20:38:22
【问题描述】:
我知道如果没有实际代码,这似乎无法确定,但请多多包涵。我认为可以从症状中确定一些东西。
我有一个层次结构浏览器,其中层次结构的每个级别都由其自己的活动显示。如果您检查层次结构的太多分支,它将引发OutOfMemoryError 异常。这听起来像是内存泄漏,但随便看看代码并没有发现任何明显的东西,所以我想在进行更彻底的调查之前对 Java 和 Android 的某些方面进行一些澄清。
首先,我可以依赖未使用的活动在OutOfMemoryError 被抛出之前进行垃圾收集吗?如果不是这种情况,我会认为这是一种奇怪的行为,但它可以解释我遇到的一切。
其次,Dalvik 垃圾收集器可以收集循环引用吗?我想我没有,但如果没有,我会知道在我的代码中寻找它。
我知道有办法在 Android 应用程序中通过创建对在程序生命周期中存在的地方的事物的引用来泄漏内存,但我不认为我正在这样做。例如,我没有以编程方式创建任何 UI 控件,也没有将当前活动作为 Context 传递给任何东西。
最后,我最近从未注意到这个错误,自从它首次创建以来唯一发生的变化是 Android 版本从某种风味的 Jelly Bean 升级为 KitKat。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
如果您不调用
finish()或您的活动,那么您不能依赖它们被GCed,因为Android 负责它们的生命周期(onCreate()与onResume())。移动到后台的活动,你没有finish(),可能会或可能不会被释放,因此有资格获得 GC。根据您的描述,我建议覆盖后退键并完成您的活动是要走的路。综上所述,当堆使用接近 OOM 条件时,Android 肯定会杀死你的活动,所以是的,我怀疑你正在泄漏一些东西。位图?
标签: java android memory-leaks