客服群里叫唤着:这个用户图片不显示了,那个用户图片也不显示了。我拿着手上一切正常的测试机,what the hell……
默默地打开bugly。
满园春色关不住,遍地内存溢出来!是的,又闯祸了!
内存问题永远是既陌生又熟悉的话题,并且大年夜多半都产生在一个叫感化户家的手机上。安卓体系本身赓续的在优化,三方框架也逐渐成熟,外加手机厂商的大年夜内存加持,似乎内存问题变得少见,但照样不克不及忽视。
借着此次修复内存问题的记录,分享一些“自认为”的解决思路,仅供参考。ok,let’s go!
修复问题的三部曲,先复现,再定位,最后修复。
估计有的人会说,异常现象都在那,有啥好复现的,冲绝代码直接开干。
复现
修复bug永远是个惊心动魄的事,稍微一不当心就有可能天崩地裂。不是修复不完全,就是惹人新问题。大年夜原由开端懂得全部启事,一方面能加深对问题的懂得,同时确保最终能验证问题是否获得修复。
内存的问题经常产生在一些比较特别的情况下,并且很多时刻不必定是必现,往往表如今一些中低端机型上。所以大年夜机型上入手可能会是一个不错的选择。
定位
经由过程以上优化方法,同样的机型再次检测,内存占用下来了....
知道问题若何复现,接下来就是定位问题到底出在哪。平日内存的问题,会碰抵站种情况:
- 内存聚积:因为间谍作况造成的页面封闭但资本还漏掉在内存中。
- 内存高占用:因为营业须要或者应用欠妥导致内存占用量过高。
我们先来看看此次的问题属于哪种情况。
在Android Studio2.3及之前版本上自带的Android monitor中,可以直不雅的反竽暌功出当前应用的┞符体内存应用程度。[若何应用对象的分享估计大年夜家都看腻了,此次就不再反复了。
之前为了在图片上显示文字但又不想被图案所影响,所以在膳绫擎加一层暗影蒙版来包管字体的显示效不雅。习惯用fresco:overlayImage的办法来实现。但这种实现方法会造成蒙版本身是一个自力的内存资本。
142MB!!!!进入变乱现场之前就已经被占用了这么多内存。难怪之后会内存异常。看来此次要先解决内存高占用的问题,我们先要具体的懂得内存的具体情况,才知道大年夜哪下手去解决,无论是避免无意义的应用或者优化须要的┞芳用。
先强迫gc一下,然后dump java heap,看一下整体内存里的情况,按照shallow size排序。
首当其冲的byte数组映入眼帘,大年夜家都明白的,bitmap一向都是大年夜客户。我们接着分析下byte[]中的各个对象。
大年夜数据上看,有很多大年夜小雷同的内存应用,大年夜理论上看竽暌功该是有很多尺寸雷同的图片。可为什么会有这么多呢?是雷同的图片反复了?or other?
所谓耳听为虚目击为实,如不雅能看到这些图片长什么样,是否就轻易做出对应的断定了?来,开端行动:
来自Gracker的Android内存优化之三:打开MAT中的Bitmap原图 | Performance。
感激Gracker的分享,Get到一个新技能。具体流程拜见传送门。主体思路就是经由过程MAT将对应的byte数组另存为图片原始文件,再用对应的对象打开预览即可。不过我记得以前Android Studio是可以直接看的,可如今不知道跑哪了。
步调一:
临时解决筹划:
因为Android Studio dump出来的文件mat是无法直接打开的,所以须要做一次转换。在Captures中找到方才dump出来的prof文件。右键 -> Export to standar .hprof 即可。
最终,经由过程bugly查到了对应的问题机型及体系版本,上各类云测平台找到了台云测试机。按照进入问题页面的几个固定流程,反复履行,最终锁定了复现流程。
步调二:
经由过程MAT Eclipse Memory Analyzer Open Source Project 打开。
步调三:
右键想要查看的对象 -> Copy -> Save Value To File。保存为xxx.data。他推荐应用Gracker分享中的gimp。Photoshop不肯定是不是我应用方法有问题,在验证的时刻一向无法正常显示。
步调四:
查看对应图片的相干属性,主体是要宽高,因为上一步中保存的是图片的原始格局文件,个中不包含对应的参数信息,所以在导入gimp中须要指定对应的参数。
推荐阅读
进级HTTPS已经是大年夜势所趋,但如有大年夜量互联网企业迟疑是否要全站进级HTTPS,本文梳理了全站进级HTTPS与部分进级HTTPS的好坏势比较,来断定是否真的有须要进行全站HTTPS进级。HTTPS>>>详细阅读
本文标题:Android中内存优化的那些事 - 一个有关图片的优化记录
地址:http://www.17bianji.com/lsqh/35002.html
1/2 1