Android 垃圾回收与内存优化

2020-05-11  本文已影响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


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

上一篇下一篇

猜你喜欢

热点阅读