OOM层出不穷,这篇《Android 性能优化实战篇》助你直击命门

67 阅读3分钟

在性能优化中,大家可能会比较关注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零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔