即使在确保我的所有位图都正确缩放等之后,我也遇到了一些烦人OutOfMemoryErrors
的问题。事实上,这个问题似乎根本与位图无关,但我可能错了。
出于测试和错误隔离的目的,我一直在使用导航抽屉(不使用后退按钮)在两个活动(我们称之为 Main 和 List)之间切换。我可以在 DDMS 中看到,每次返回时分配的内存都会增加大约 180 KB。
我已经完成了内存转储并使用 eclipse MAT 分析了 3 个不同的时间点:
我怀疑内存泄漏,但我无法真正找出其原因。根据内存转储,它看起来像是“剩余”并且java.lang.FinalizerReference
不断增加。这个问题的用户在他的内存转储中也有很多FinalizerReferences
,但答案不是很清楚。
我在最后一个时间点所做的泄漏嫌疑人报告并不是很有帮助,因为它怀疑android.content.res.Resources
并且android.graphics.Bitmap
似乎不会随着时间的推移而增长:
在其中一份报告中(遗憾的是,这里没有出现)我已经看到 13 个实例被android.widget.ListView
指出为潜在的泄漏嫌疑人。
这些内存增加发生在活动之间的任何转换(不仅仅是我在这个例子中使用的 Main 和 List)。
我怎样才能找到(非显而易见的?)内存泄漏?我一直在挠头很长一段时间,所以任何帮助和提示都会很棒。
编辑:
位图(@OrhanC1):我已经评论
Bitmap
了上述两个活动中的任何实例化,并且内存仍在增加。内存转储仍然显示一些位图,但我相信它们与资源有关,而不是我分配的实际位图。关于自定义字体(@erakitin):我正在使用它们,但我使用单例
Typeface
在我的Application
上下文(public class MyApp extends Application
)中保留了每个的单个实例。我已经尝试在上面提到的两个活动中评论对字体的任何引用,但内存仍在增加。我不认为我在泄漏
Context
(@DigCamara):我在这两个活动中没有任何静态引用,我使用Application
上下文而不是Activity
's 除了在适配器中。如果我保持不变Activity
并进行一些屏幕旋转,则内存不会增加。基于@NickT 的评论:我可以看到我有很多这两种活动的实例。这些内存增加是否仅仅是后栈活动数量增加而不是内存泄漏的结果(我虽然操作系统处理了这个问题,但显然不是)?如果我使用
FLAG_ACTIVITY_REORDER_TO_FRONT
意图标志,那么内存只会增加,直到所有不同的活动都被实例化(一次)。对此事有用:当内存不足时,Android 不会从堆栈中杀死活动。