Android OOM 排查与解决——图片加载优化
1、OOM 引起与表现
在 Android 这种移动设备上,如果代码没有处理好,很容易引发内存持续占用与泄漏,导致 OOM(OutOfMemoryError)
异常,进而导致 App 程序 Crash 挂掉。
在 Android 开发中,一个典型的 OOM 异常如下:
一旦碰上了这类错误,我们往往需要去排查内存了。导致 OOM 的一些情况比较常见,大多数情况下,大家可能遇到的都是同一种情况:
- Activity 泄漏导致;
- 层次庞大复杂的 View 视图导致;
- 大量图片持续占用导致;
- 其他资源持续未释放导致。
2、Android Studio 查看内存占用
在 Android Studio 里面,我们可以在 Monitors
窗口中,实时对 App 内存进行监控,我们可以看出 App 的 HeapSize
、已经使用的内存大小
、剩余内存大小
以及峰值变化
。有了这些信息,我们可以在某个页面打开和关闭时进行监控,从而对比该页面占用内存变化,可以很方便的定位问题。
在这张图中,如果已使用的内存大小(Allocated
)接近到 HeapSize
的大小,App 将会处于非常危险的状态中,很有可能下一个操作就会直接导致 OOM,通过 Android Studio,我们可以防患于未然,在 Debug 阶段进行预防。
3、adb 查看内存占用
adb
工具也是一个非常有用的工具,我们可以通过它来查看 App 内存占用。
3.1、查看 JVM 的 HeapSize
等参数
通过命令 adb shell getprop dalvik.vm.heapsize
可以直接查看 Dalvik 虚拟机为 App 规定的最大 HeapSize
:
一般来说,App 可达到的最大 HeapSize 为 dalvik.vm.heapgrowthlimit
所规定的大小。但是如果我们在 AndroidManifest.xml
中为 Application 添加 an