为什么要进行内存优化?
1.App运行内存限制,OOM导致App崩溃
2.App性能:流畅性、响应速度和用户体验
Android的内存管理方式
Android系统内存分配与回收方式
● 一个App通常就是一个进程对应一个虚拟机
可以通过下面的命令在终端来查看Android系统进程和内存分配
adb shell:进入Android底层Linux系统命令
ps: 查看系统进行的命令
dumpsys meminfo 进程名:查看内存分配
● GC只在Heap剩余空间不够时才会触发垃圾回收机制
App内存限制机制
● 每个App分配的最大内存限制,岁不同设备而不同
● 吃内存大户:图片
切换应用时后台清理机制
● App切换时采用的是LRU Cache算法
LRU算法:最近使用的排在最前面,最少可能被清理掉
● onTrimMemory()回调方法
当系统的内存有变化的时候,会发出这个回调方法给各个应用,当应用收到这个回调时,释放内存。
监控内存的几种方法
方法1:通过代码查看
方法2:Android Studio的自带工具Android Monitor来查看App整体内存变化
方法3:Android Studio Tools → Android → Android Device Monitor启动设备监控
Android App内存优化方法
数据结构优化
1.频繁字符串拼接用StringBuilder
2.ArrayMap、SparseArry替换HashMap,内存使用更少,效率更高
3.内存抖动
内存抖动是指在短时间内有大量的对象被创建或者被回收的现象。内存抖动出现原因主要是频繁在循环里创建对象,导致大量对象在短时间内被创建,由于新对象是要占用内存空间的,如果一次或者两次在循环里创建对象对内存影响不大,不会造成严重内存抖动,这样可是以接受也是不可避免的,如果是频繁创建对象的话,内存抖动就会很频繁,频繁的内存抖动,会导致垃圾回收机制频繁运行(短时间内产生大量对象,需要大量内存,而且还是频繁抖动,就可能会需要回收内存以用于产生对象,垃圾回收机制就自然会频繁运行了)。
4.再小的Class也会耗费0.5KB
对象复用
1.复用系统自带的资源
2.ListView/GridView的ConvertView复用
3.避免在onDraw方法里面执行对象的创建
避免内存泄漏
1.内存泄漏会导致剩余可用Heap越来越少,频繁触发GC
2.尤其Activity泄漏
3.用Application Context而不是Activity Context
4.注意Cursor对象是否及时关闭
OOM问题优化
OOM问题分析
OOM的绝大部分都是跟图片相关的
强引用、软引用的意义
如果内存不够,强引用在生命周期内是不会被回收的,而软引用是可以被GC回收的。
优化OOM问题的方法
1.注意临时Bitmap对象的及时回收
2.避免Bitmap的浪费
3.Try catch某些大内存分配的操作
4.加载Bitmap:缩放比例、解码格式、局部加载