[关闭]
@linux1s1s 2019-02-14T14:16:51.000000Z 字数 905 阅读 2061

Android 内存分析(二)

AndroidMemory 2015-06


阅读此文请先参考Android 内存分析(一),这里直接给出内存分析的例子

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 一般是有两种典型情况引起的

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注