IOS手机系统王者的地位一直稳如老狗,Android虽然一直在完善,但目前仍然在很多方面难以超越IOS,被拿捏得死死的。新贵鸿蒙作为一款发布才 2年时间的国产操作系统,其技术优越性也是崭露头角,尽管目前的鸿蒙 OS 生态不够完善,较苹果 iOS 和安卓仍存在一些差距,但随着时间推移,这些困难终将被克服。
那么问题来了,Android开发者们该如何在这个系统中步步为营,才能争取到更多用户的芳心?答案只有一个:性能优化。一款产品的性能优化做的好,拥有超顺滑的操作流畅度,才能让精心设计的功能得到更好的展现。目前各大厂也是对性能优化人才求贤若渴。
在性能优化中,大家可能会比较关注UI界面优化、耗损(电量,流量)优化,但其中内存优化才是命门所在。很多时候由于项目需要,大家都是拼命的加班加点的赶进度,为了追求效率很多代码可能就写的不(放)够(飞)规(自)范(我),从而造成内存泄漏,在试运行阶段bug不断,OOM层出不穷。
单例造成的内存泄漏:单例的静态特性导致单例的生命周期和应用的生命周期一样长,这就说明如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。
非静态内部类创建静态实例造成的内存泄漏:在启动频繁的Activity中,为了避免重复创建相同的数据资源,就在Activity内部创建了一个非静态内部类的单例,非静态内部类默认会持有外部类的引用,而又使用了该非静态内部类创建了一个静态的实例,该实例的生命周期和应用的一样长,导致该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收。
Handler造成的内存泄漏:平时在处理网络任务或者封装一些请求回调等Api都会借助Handler来处理,对于Handler的使用代码编写一不规范即有可能造成内存泄漏。
线程造成的内存泄漏:
//——————test1
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
SystemClock.sleep(10000);
return null;
}
}.execute();
//——————test2
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(10000);
}
}).start();异步任务和Runnable都是一个匿名内部类,因此它们对当前Activity都有一个隐式引用。如果Activity在销毁之前,任务还未完成, 那么将导致Activity的内存资源无法回收。
资源未关闭造成的内存泄漏:BraodcastReceiver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
很多朋友表示,内存泄漏我用LeakCanary可以纠察,但纠察之后为什么还是OOM?
没有内存泄漏,为何仍旧OOM?
没有内存泄漏却仍然OOM,多半是内存抖动在作祟。它会导致程序的莫名卡顿,甚至Crash和OOM。很多开发者面对这种问题毫无头绪,甚至不知道什么是内存抖动:
内存的频繁分配和回收会导致内存不稳定,就会出现内存抖动,它的通常症状为频繁GC、内存曲线呈锯齿状。 伴随着频繁的GC,导致GC线程采集垃圾的时候会把项目中的主线程、其他工作线程都被挂起,用户的操作交互会有无反应的状态,这就是卡顿 。 内存不连续,由频繁申请回收内存(内存抖动)导致大量内存碎片的产生,引起在创建对象时(如数组、字符串)没有足够连续的内存空间引起OOM。
内存抖动的危害不可忽视,程序莫名卡顿甚至Crash都可能是因为内存抖动造成的。很多开发者对此毫无头绪,甚至对内存抖动一无所知。对于内存泄漏目前有快手KOOM、微信Matrix等等工具帮助大家排查内存泄漏问题,然而并没有一款工具能够方便地帮助大家解决内存抖动,想要解决内存抖动,必须要深入学习其中的底层原理。
为了帮助大家更好地学习内存性能优化,解决内存泄漏、抖动的问题,我们特邀腾讯课堂的Lance位老师,在4月20日-21日为大家进行详细的讲解:
▲微信号:xiangxuekl
长按扫码添加客服,
锁定 「免费」 名额
【直播+录播】【笔记课件】+【源码】
仅前 300 人有效,先到先得!
直播学习中加赠-【Android性能优化-大厂面试高频问题实战解析】
4月20日-21日,2天时间,Lance老师带领大家学习内存优化,帮大家系统地梳理源码的学习路线、以及高效的学习方法,并且结合实战带你分析相关高频面试问题。听课后,还能获取互联网环境中,Andorid核心技术路线图,里面的内容和方向,让你学习起来更明确,更体系:
参加直播听课还有机会获得《Android架构开发手册》:
独特训练营实战服务