为了测试和隔离错误,我一直在使用我的导航抽屉(而不是使用返回按钮)在两个活动之间切换(让我们称它们为Main和List)。我可以看到在每次返回时分配的内存增加了约180 KB。
我已经进行了内存转储,并使用Eclipse MAT分析了三个不同的时间点: 我怀疑存在内存泄漏,但我无法找到其原因。根据内存转储文件,似乎是“Remainder”和
java.lang.FinalizerReference
不断增加。此问题中的用户在内存转储文件中也有很多FinalizerReferences
,但答案不太清楚。我在上一个时间点制作的“泄漏嫌疑报告”并没有提供太多帮助,因为它怀疑
android.content.res.Resources
和android.graphics.Bitmap
,但这些内容似乎并没有随着时间增长而增加:
在其中一个报告中(遗憾的是,此处未提供),我看到有13个android.widget.ListView
实例被指定为可能的泄漏嫌疑对象。这些内存增加发生在任何活动之间的转换中(不仅仅是我在示例中使用的主列表)。
我如何找到(不明显的?)内存泄漏?我已经苦思冥想很长时间了,所以任何帮助和提示都将非常感激。
编辑:
位图(@OrhanC1):我已经在上述两个活动中注释了任何
位图
实例化,但内存仍然增加。内存转储仍然显示一些位图,但我认为它们与资源相关,而不是我分配的实际位图。关于自定义字体(@erakitin):我正在使用它们,但我在我的
Application
上下文(public class MyApp extends Application
)中保留每个Typeface
的单个实例,使用单例模式。我尝试注释掉上述两个活动中对字体的任何引用,但内存仍然增加。我不认为我泄漏了
Context
(@DigCamara) :我没有在这两个活动中保存任何静态引用,我使用的是Activity
的Application
上下文,除了适配器之外。如果我呆在同一个Activity
并进行一些屏幕旋转,内存不会增加。根据@NickT的评论:我可以看到我有许多这两个活动的实例。这些内存增加可能只是后退堆栈中活动数量增加的结果,而不是内存泄漏(我认为操作系统会处理,显然不是)?如果我使用
FLAG_ACTIVITY_REORDER_TO_FRONT
意图标志,则内存仅在所有不同的活动被实例化(一次)之前增加。对于此问题很有用:Android not killing activities from stack when memory is low。