我正在尝试优化我的应用程序的内存使用情况。从广播接收器和服务到位图和静态变量,几乎无所不包。 我认为我的应用程序中有很多内存泄漏需要处理,但希望它永远不会给出内存不足异常。
我想知道避免过多内存消耗的最佳方法是什么,我是否必须始终回收位图?因为我从来没有这样做过,向 Activity 上下文或应用程序上下文注册广播接收器是否很好,使用静态变量访问 Activity 之间的数据是否安全,我应该为 Activity 中的每个变量赋予空值吗?它们可以被垃圾收集还是没有必要?
有很多问题,但就像这是我的第一个 Android 应用程序一样,代码在某些地方做得很糟糕,而且很复杂。
要打造高性能且出色的应用程序,最佳实践是什么?
最佳答案
最重要
如果您正在寻求内存优化,最重要的一步是检查与垃圾收集器相关的 logcat
消息。类似于:
12-01 19:12:09.138: D/dalvikvm(31828): GC_CONCURRENT freed 158K, 3% free 10259K/10503K, paused 15ms+0ms, total 19ms
第一个值是本次运行中 GC 释放的量,第二个值是您的应用程序使用的量,第三个值是分配给您的应用程序的量。最后一个值随着您的应用程序需要内存的增加而增长,直到分配的内存达到系统允许的最大量,并且您的应用程序被终止。 Honey Comb
之前的 SDK 具有更多值,即 Dalvik Vm
之外使用的内存,通常由 Bitmap
对象使用。
因此,最重要的测试是通过使用您的应用一段时间来完成,并检查已用/分配内存的值是否保持稳定或持续增加。
如果它保持稳定,您的分析就完成了,您可以去喝杯咖啡了:-)
如果它不断增加,那么也许最好开始检查你的内存去向......
做什么
要实现良好的内存使用,最基本的好规则是释放(清空)不再需要的任何对象。对于大多数非静态对象,这是自动完成的,因此您应该主要关注静态对象,确保在不需要时为它们分配 null。
棘手的
内存泄漏的最常见原因是静态对象未正确管理并持有对以下内容的引用:
- 上下文
- View (包含对上下文(也可能还有位图)的引用
- 线程(不容易被GC收集)
- 处理程序(保存对上下文的引用)
- BitMap(主要是 Honey Comb 之前的版本,GC 收集它们的效率不高)
最终说明
如果您可以花一小时,请观看 Google IO 2011 的视频,其中 Patrick Dubroy 解释了如何使用 MAT 来识别内存泄漏:Google I/O 2011: Memory management for Android Apps .
它确实帮助我在我的应用程序中开始内存调整。
问候。
关于android - Android应用程序中什么占用了最多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672453/