一些资料记录:
一、
二、
三、
四、
五、
六、
调用 ActivityManager.getMemoryClass()
方法可获取当前应用可用的内存大小(单位 = 兆)
调用 onTrimMemory()获取应用程序 当前内存使用情况(以内存级别进行识别),可根据该方法返回的内存紧张级别参数 来释放内存
OnTrimMemory优化
内存泄漏的主要原因
-
集合类 :
集合类用完后,仍引用着集合对象,导致该集合对象不可被回收,从而导致内存泄漏。
最简单的解决:清空集合对象 & 设置为null ,如: list.clear(); list=null; -
Static关键字修饰的成员变量 :
Static变量的生命周期 = 应用程序的生命周期
若被 Static 变量引用耗费资源过多的实例(如Context),则容易出现该成员变量的生命周期 > 引用实例生命周期的情况,当引用实例需结束生命周期销毁时,会因静态变量的持有而无法被回收,从而出现内存泄露。
如:单例引用一个变量,即使该变量已不再使用,也无法被回收。 -
非静态内部类 / 匿名类 :
非静态内部类 / 匿名类 默认持有 外部类的引用;而静态内部类则不会。
如:Handler,AsyncTask -
资源对象使用后未关闭 :
对于资源的使用(如 广播BraodcastReceiver、文件流File、数据库游标Cursor、图片资源Bitmap等),若在Activity销毁时无及时关闭 / 注销这些资源,则这些资源将不会被回收,从而造成内存泄漏。解决:及时关闭 / 注销资源 / 反注册。
Bitmap的优化
Bitmap内存占用 ≈ 像素数据总大小 = 横向像素数量 × 纵向像素数量 × 每个像素的字节大小
- 设置图片缓存:避免同一图片重复占用内存
- 加载合适大小的图片:Bitmap的内存占用根据 x、y的增加而增加。
- 使用合适的解码方式:
- 使用完Bitmap后及时释放:
-
res中图片资源文件合理放置目录:ldpi、mdpi、hdpi 、xhdpi、xxhdpi、xxxhdpi、xxxxhdpi 会进行不同倍数的缩放;
Bitmap优化策略
内存辅助工具
-
android studio 之 Profile
android studio 之 Profile -
android sdk 之 Heap Viewer
点击sdk下tools文件夹下的 monitor 即可打开
android sdk 之 Heap Viewer -
LeakCanary (一个square出品的Android开源库)
用来检测内存泄漏
下载地址 https://github.com/square/leakcanary
(部分内容参考于网络,如有不妥,请联系删除~)
网友评论