@linux1s1s
2019-02-14T22:16:51.000000Z
字数 905
阅读 2207
AndroidMemory
2015-06
阅读此文请先参考Android 内存分析(一),这里直接给出内存分析的例子
先来看一张内存状态图
这个是普通App在Eclipse中跟踪进程,并使用内存分析工具点击 Dump HPROF file 进入MAT后的界面,对于最右边的6.4MB,鼠标放在上面可以看到这个占用的资源是Android系统内部资源class android.content.res.Resources @ 0x4113eb48,所以这一部分不需要花时间去分析了,紧接着出现两个6.4MB的内存占用,对这两个部分同样先看看是哪个部分占用的,鼠标放在上面显示 android.graphics.Bitmap @ 0x4221eed8,所以可以断定,由于比较大的位图占用,导致内存使用比较紧张,有可能会发生OOM问题,接下来还可以看看到底是哪个BitMap占用内存,点击选择排除弱/软引用以后跳转到下面界面:
紧接着选择 outgoing references(查看这个对象持有的外部对象引用),进入下面这个界面
可以看出由于这个Bitmap @0x41525Bd8对象持续有引用向量,所以一直没有被GC掉,这样有可能引发OOM,接下来我们想知道这个对象张什么样,肿么办?
好办,只要将这个对象保持下来,然后用而二进制位图工具打开就可以了。
查看高度和长度参数:(2048*816),然后保存下来
接下来打开这个bitMap数据即可,注意使用RGB-Alpha,宽度和高度设置好以后就可以看到图像了。
最后打开即可
所以找到真凶了,是一张分辨率为:2048*816 的位图占用了6.4M的内存,所以有可能引发OOM问题
- 将server端的对应bitMap全部更换成小分辨率的位图 (不推荐)
- 将server端拿下里的bitMap经过一种合适的算法自适应Android View,尽量的将不必要像素格式化掉。 (推荐)
OOM 一般是有两种典型情况引起的