Android内存优化了解

作者: 正阳Android | 来源:发表于2017-12-27 19:13 被阅读13次

    在讲解内存优化之前,我们先看下adb命令;

    输入adb shell可以查看手机所有进程的内存使用情况;

    我们知道一个app通常就是一个进程,对应一个虚拟机。

    我们在执行,dumpsys meminfo com.xxx.xxx 可以查某一个应用的内存使用情况

    内存使用如图

    当然我们也可以利用AndroidStudio的Android Monitor来更加直观的查看内存使用情况。不知道为什么我升级到3.0.1找不到Android Monitor了,有知道的麻烦告知我一下哈。 目前大家也可以通过Android Device Monitor查看内存使用情况。

    另外java中内存分配和释放是两条线,虽然简化了程序员的工作,但是加重了jvm的工作,所以我们要对内存进行优化。

    ok言归正传,我们简单看下内存是如何优化。

    1.首先看一个方法(可以在Activity里面对其重写,Application,Fragment以及Service内都可以重写)

           @Override

         public void onTrimMemory(int level) {

            super.onTrimMemory(level);

        }

    它的主要作用是提示开发者在系统内存不足的时候,通过处理部分资源来释放内存,从而避免被 Android 系统杀死。这样应用在下一次启动的时候,速度就会比较快。

    参数level的等级有以下七个

    如图,等级代表意思

    我们肯定是不会再complete的时候才去清理内存;一般建议在40或者是60的时候就可以去清理内存了;例如释放掉一些图片缓存,文件缓存,我们使用第三方图片加载库的时候会开启三级缓存,这个时候我们可以去清理掉内存缓存。

    2.数据结构上的优化

     第一,字符串频繁操作的话使用StringBuilder而不是String,因为使用String会创建很多对象,并且性能也会受到影响。

    第二, 可以使用ArrayMap,SparseArray(稀疏数组)替换HashMap,因为他们都比HashMap使用的内存少。如果key是int类型,那么建议使用SparseArray,因为避免了自动装箱的过程;若key是String那么建议使用ArrayMap。(具体为什么要比HashMap使用内存少,需要看下源码,也就是了解三者底层是如何实现的了,有机会我在比较下三者的数据结构)

    3.对象复用

    第一,可以的话尽量使用或者复用系统自带的资源

    第二,ListView,GridView中的ConverView的复用。

    第三,避免在onDraw方法中创建对象,因为每次view变化都会执行onDraw方法。

    4.避免内存泄漏

    第一,使用Application Context代替ActivityContext;

    第二,注意Cursor对象的关闭,例如在操作数据库的时候执行结束记得关闭

    第三,使用WebView的话,单独开一个进程,并且在结束的时候杀死进程;或者是使用腾讯开放的x5内核的Webview。

    第四,慎用static,因为静态对象的生命周期和整个应用的生命周期一致,假如Activity中有一个 内部类,我们声明了一个静态内部类对象,由于内部类持有Activity的引用,导致Acvitiy就会无法释放。

    第五,对于临时的Bitmap对象进行置为空或者调用recycle方法。

    第六,Handler的使用,Activity中使用handler执行了一个10s的定时操作,但是还没有到10s就关闭了Actviity,那么就会导致actvity无法被回收;解决办法就是static修饰handler,这样handler就不会持有Activity的引用。并且在onDestroy方法中调用handler的removeCallbacks方法移除message;不但避免了内存泄漏而且在退出Activity的时候取消了定时器,10s后也不会执行run方法。

    5.强引用和软引用的使用。

    在开发中,我们可以使用SoftReference,和强引用的区别就是当内存不足的时候强引用不会被回收,但是软引用可以被回收。

    主流的图片加载框架都使用到了软引用。

    相关文章

      网友评论

        本文标题:Android内存优化了解

        本文链接:https://www.haomeiwen.com/subject/hyiugxtx.html