记一次诡异的OOM坑

OOM,即OutOfMemory。作为Android设备常见的性能问题,经常见于图片大量加载的场景。然而博主这次碰到的OOM,却是由一个意想不到又合情合理的问题导致。由于是半路接手一个正在开发的项目,着实被坑了一把。

一. 场景描述:

  1. 在一个Activity中,会异步生成一张二维码图片。不过这个功能显然是后来匆忙加的,因为二维码Bitmap并没有缓存(项目其它地方的图片都是用Glide)。这样导致每次进入Activity,都会重新创建一个Bitmap。

    image

  2. 在使用App较长时间后,再次进入这个Activity偶尔会导致OOM。

二. 尝试解决

  1. 这个二维码Bitmap,像素为700*700.我们尝试使用Glide加载到ImageView中,这样只会在第一次进入Activity时,才会通过ZXing创建二维码Bitmap。

    不过在经过测试之后,仍然会出现OOM。我们打开Android Profiler,来监测内存情况:

    image

  2. 对比进入Activity前后的内存占用情况:

    image

    image

    Graphics的内存占用突然增长了51M。

    而且是每次进入Activity,都会发生如此剧烈的抖动,除了二维码图片,还有其它的问题。

  3. 注释掉二维码图片的生成,然后再次观察测试。情况依旧,内存占用峰值瞬时增加50-100M:

    image

三. 大家来找茬

  1. 疑点:

    在有点懵圈的时刻,不经意间瞟了一眼界面,发现了可疑之处:

    image

    开始看见这块白色背景时,还以为是设置了color;

    切到相关布局xml一看:

    android:background="@drawable/layout_bg"
    

    很好,去目录下看看这张图:

    image

    简直吓死宝宝了,一张1034*1398的无码高清PNG大图…

  2. 再次尝试:

    android:background="#ffffff"
    

    顺滑多了:

    image

    至此问题解决,罪魁祸首就是那一张高分辨率无码高清大图。

四. 小结

  1. Android Profiler是好工具。
  2. 任何图片的加载,都会出现增加内存开销。图片缓存的意义也就在于此-----通过缓存策略控制图片的内存消耗。然而直接在XML中设置加载图片,就没办法使用缓存了。
  3. 本来这个问题应该很容易发现的,但半路接手项目,还不太熟悉,以至于走了弯路。当然,那张二维码图片仍然是应当缓存起来的。
  4. 要跟产品、美工沟通好,这种神奇的背景图片就不应当用,它会拖慢加载速度,增加内存压力。而且还有更好的处理方式。比如9Patch,VectorDrawable,等等。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值