美文网首页
Android 垃圾回收与内存优化

Android 垃圾回收与内存优化

作者: 木木禾木 | 来源:发表于2020-05-11 14:15 被阅读0次

    一些资料记录:

    一、

    java内存模型

    二、

    垃圾回收算法

    三、

    垃圾回收器
    对象的新生代、老年代、永久代关系

    四、

    垃圾回收机制与调用System.gc()区别

    五、

    Android内存优化

    六、

    调用 ActivityManager.getMemoryClass()方法可获取当前应用可用的内存大小(单位 = 兆)
    调用 onTrimMemory()获取应用程序 当前内存使用情况(以内存级别进行识别),可根据该方法返回的内存紧张级别参数 来释放内存
    OnTrimMemory优化

    内存泄漏的主要原因

    1. 集合类 :
      集合类用完后,仍引用着集合对象,导致该集合对象不可被回收,从而导致内存泄漏。
      最简单的解决:清空集合对象 & 设置为null ,如: list.clear(); list=null;

    2. Static关键字修饰的成员变量 :
      Static变量的生命周期 = 应用程序的生命周期
      若被 Static 变量引用耗费资源过多的实例(如Context),则容易出现该成员变量的生命周期 > 引用实例生命周期的情况,当引用实例需结束生命周期销毁时,会因静态变量的持有而无法被回收,从而出现内存泄露。
      如:单例引用一个变量,即使该变量已不再使用,也无法被回收。

    3. 非静态内部类 / 匿名类 :
      非静态内部类 / 匿名类 默认持有 外部类的引用;而静态内部类则不会。
      如:Handler,AsyncTask

    4. 资源对象使用后未关闭 :
      对于资源的使用(如 广播BraodcastReceiver、文件流File、数据库游标Cursor、图片资源Bitmap等),若在Activity销毁时无及时关闭 / 注销这些资源,则这些资源将不会被回收,从而造成内存泄漏。解决:及时关闭 / 注销资源 / 反注册。


    Bitmap的优化
    Bitmap内存占用 ≈ 像素数据总大小 = 横向像素数量 × 纵向像素数量 × 每个像素的字节大小

    1. 设置图片缓存:避免同一图片重复占用内存
    2. 加载合适大小的图片:Bitmap的内存占用根据 x、y的增加而增加。
    3. 使用合适的解码方式:
    4. 使用完Bitmap后及时释放:
    5. res中图片资源文件合理放置目录:ldpi、mdpi、hdpi 、xhdpi、xxhdpi、xxxhdpi、xxxxhdpi 会进行不同倍数的缩放;


      Bitmap优化策略
    Bitmap的编码方式

    内存辅助工具

    1. android studio 之 Profile


      android studio 之 Profile
    2. android sdk 之 Heap Viewer
      点击sdk下tools文件夹下的 monitor 即可打开


      android sdk 之 Heap Viewer
    3. LeakCanary (一个square出品的Android开源库)
      用来检测内存泄漏
      下载地址 https://github.com/square/leakcanary


    (部分内容参考于网络,如有不妥,请联系删除~)

    相关文章

      网友评论

          本文标题:Android 垃圾回收与内存优化

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