- 堆分为Java堆和native堆,Java堆是一块共享内存,安卓把它封装成了一个spaces,它其实由底层libc的malloc和free来进行申请内存和释放内存
查看一个app的内存
adb shell dumpsys meminfo 包名
内存优化的目的
- 降低OOM、抖动和泄漏
- 提高app流畅度
- 减少内存占用提高后台存活率
Java回收
- Java的垃圾回收算法是G1(1.7开始1.9默认),分新生代和老年代。并发和并行、高效的回收、尽量在后台回收。
- 强、软、虚、弱四种引用类型
- 可达性分析算法
内存优化
- 内存泄漏:本来释放的内存被占用
- 内存抖动:短时间触发大量对象的创建与回收,容易触发GC。通常会暂停所有线程的执行,这样GC可能会导致卡顿。使用对象复用来解决,比如消息队列里的MessagePool
- 内存溢出:单次分配内存过大、线程数量过多、进程数量过多、多次分配内存导致内存不足、fd超过限制(导致崩溃)。
内存优化工具
-
Android profiler
-
MAT
-
Visiual VM
内存监控工具
- matrix 通过hook技术来监控app的使用情况,并生成文件来上报
- Koom 使用多进程来优化了;生成的文件很小
- Visiual VM
- leakcanary
- probe
常规的内存优化
- 良好的代码设计和适合的数据结构、设计模式
- 对象的复用 对象池、Parcelable
- 资源的复用
- 压缩图片
图片(bitmap)
bitmap:分为引用存储在Java堆内存和像素内存存储在native。
-
像素格式: AGB565 2个字节 ARGB888 4个字节
-
glide、
-
资源目录不同,占用内存不同
-
根据设备可用内存不同的配置不同的策略
-
大图监控:hook onResourceReady, Epic
-
bitmapFractory.options
- inSampleSize
- inJustDecodeBound = true 解析宽高
- inMutable 可以被修改,从而复用bitmap
内存泄漏
生成周期长的持有短的,导致短的无法被回收,打断引用链即可。
- 资源被关闭
- 监听应该成对出现
- 系统bug inputMethodManger
- webView 内存泄漏。多进程
- 线程泄漏
- View 不要使用静态声明,使用application
- 内部类:使用静态内部类,谨慎使用匿名内部类; kotlin的匿名内部类,如果未引用外部类则在编译成字节码后会生成改为静态内部类。所以不会内存泄漏。Java要小心