Android内存优化了解

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

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

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

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

《Android内存优化了解》 内存使用如图

当然我们也可以利用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的等级有以下七个

《Android内存优化了解》 如图,等级代表意思

我们肯定是不会再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.jianshu.com/p/930e2085cc2b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞