吾生也有涯,而知也无涯。这篇文章主要讲述android内存泄露相关研究整体看相关的知识,希望能为你提供帮助。
在android项目开发的时候,内存问题一直都是很困扰我们的常见的问题,在实际开发中,如何在开发时就很好的约束&
控制内存已经成为了一件恨重要的事情了。
【android内存泄露相关研究整体看】1.为什么要在开发时就要约束内存
因为小编从事过不同类型的APP的开发,混合式语言开发是我们现在开发中使用最常见的一种,在不同的脚本语言的时候,我们的内存产生也会不一样。
列子:下面小编就拿1)非常原生的App2)hybrid web App3)lua脚本语言APP
备注:因为本人电脑问题,不能够添加图片,具体证明类图片会在后期闲置的时间添加
结果:在这三种情况下的布局产生的内存不一样,也有很多ce回说是因为他们的一些框架原理不一样导致的,确实,lua脚本是使用的反射,hybrid更多的是使用addjavascript function,拿最简单的第一种情况和第二种情况来看,我们就会发现,我们在创建一个线性布局的时候,3)产生的内存会比1)多,并且写入回收方法一样,会发现,当我们调用ondestory()回收function的时候,1)会很快速的回收掉,而3)却不一定,顾我们得出了如下结论,在使用不同的框架构造的时候,会对我们的内存产生也有很大的影响,顾我们在初期的时候一定要注意使用的框架架构,使用的什么混合性语言开发方式,如果不在开发的时候去约束内存,当我们开发测试阶段在约束控制内存就会发现异常的棘手
2.资源文件
从java转行做android的时候,就发现android的图片格式对应图片算法真的超级吓人,随便一张小小的图片,看着也就2,3kb,计算下来就很大,顾资源图片的大小,以及读取方式(这里指ps中图片保存读取位数以及图片清晰度等)会在很大程度的影响内存,尤其是在差在很多大公司提倡插件化,热更新之后,会在框架实现中以及,图片加载中,图片会被提前编译然后装载APK,会让图片的含KB量变得异常的吓人,如何控制呢,
1>
观察,首先观察图片,看是否可以做成.9图,如果可以做成点九图,一定要做成点9图偶
2>
图片压缩,不少ce会觉得图片的kb数量对内存影响不大,图片的大小才是影响内存的最大头
其实不然,在实际开发中,我们常常会发现,很多公司设计师在切图的时候,并不会对图片进行压缩,当我们拿着100kb的图片直接填充view的时候,更具计算我们会发现内存超级吓人,顾发生OOM也是很常见的事情了对不对。我们这个时候就要开发自己进行一个压缩图片,之前有同行问我.9图是否也可以压缩,经过本人的实验,.9图是可以进行适量的压缩,但是不能够压缩的太狠,否则会导致读取异常,一般读取异常的表现,就是把.9图当作普通图案读取,所以需要特别注意哈。
3>
资源图片使用,我们一定要注意图片的复用,如果框类型相同,最好直接写xml shape 而不是用多张图片
3.单列【程序代码】
在我们实际开发的时候,还是会写很多的单列方法的,比如说我们常常使用的公用的判null方法,以及mask手机号,mask身份证等这样的方法类,单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存就会溢出,顾一定需要注意偶。
4.内部类【程序代码】【参考了http://www.cnblogs.com/deman/p/5860976.html】
java中的内部类(匿名内部类),会持有宿主类的强引用this。
所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。
Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。
5.java data 产生内存
之前在富民银行工作的时间,当时的PM上司,来自北京,就给妹子说,java data产生的内存可以不考虑,很少很少,但是经过本人的具体研究并不是如此,看了一些书,不仅发现了Shareperence存储值有限制,activity与activity之间传值也是有限制的,有兴趣的盆友,可以百度看看,有很多类似的文章,还是非常感谢那些技术盆友的分享,平时的我很少关注这些,也是才看到,发现真的如此,顾java data产生的内存也是很大的一块,不少的盆友喜欢用 okhttp相关框架,数据的解析方式真的在很大的一块会影响内存,for example
1》.
静态集合类引起内存泄露
主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。
我们在使用adb 提供的内存查看研究工具的时候也可以很明显看到有一行叫做java data ,顾在实际看法的时候一定要对json/xml等相关解析框架有一定的了解
6.项目编译apk中叠加了无用资源等引发的内存溢出
之前本人在开发成都银行手机app的时候,常常遇到在小手机上打开apk导致内存一出,我们使用开发工具es,as的时候,尤其是AS生成apk的时候会叠加很多无用class以及资源,这些都会因为功能等很大程度引发内存溢出,比如在我们打开手机银行app的时候我们需要热更新下载某些图片资源就会引发,这些在常见的有换肤请求APP中体现最明显,顾也很重要
上面就是小编的一些看法,没有图片较显枯燥,如果与小编有不同看法,可以发邮件至[email
protected],一起交流技术,一起成长。
大家一起比较关心的图片动画等引起的内存问题将会在其他的文章中与大家一起探讨
推荐阅读
- Android-自己定义图像资源的使用
- Android——推断Service是否已经启动
- 我的Android进阶之旅------>Android嵌入图像InsetDrawable的使用方法
- [Android]冷门常用 ADB
- VS2017 Cordova 出现错误 @ionic/app-scripts 未安装
- Android的静默安装
- 我是如何理解Android的Handler模型_2
- 出现Android.os.NetworkOnMainThreadException 错误
- Android studio统计项目总行数