在性能优化中,大家可能会比较关注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销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
更多Android进阶指南 可以详细Vx关注公众号:Android老皮 解锁 《Android十大板块文档》
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔