内存管理
1. 内存管理机制概述
1. 分配机制
操作系统会为每个进程分配合理的内存大小,保证每一个进程能够合理的运行,而不至于内存不够用或者某个进程占用太多的内存。
2. 回收机制
系统内存不足时,会有一个合理的回收再分配内存的机制,保证新的进程能够正常运行。
2. Android内存管理机制
1. 分配机制
弹性内存分配:开始分配一个小的内存大小(根据物理设备的内存大小决定),等到当前内存不够使用时,会逐步分配更大的内存空间,但是有一个最大值。安卓系统是想让更多的应用进程能够存活到内存中,再次启动时,直接恢复进程而不需要再次启动进程,提升用户体验。
// 查看当前进程可以申请的最大内存
Runtime rt=Runtime.getRuntime();
long maxMemory=rt.maxMemory();
2. 回收机制
遵循一个宗旨:尽最大限度的使用。(继承linux),缺点:当进程不再使用的时候,内存中还会保存有该进程的数据。安卓在内存不够使用的时候会杀死其他进程给新进程使用,进程有优先级之分。
前台进程(正在交互的进程)
可见进程(可见但无法交互的进程)
服务进程
后台进程
空进程(GC能够直接回收)
(后台进程和空进程比较容易被回收)
3、 内存管理机制的特点
1. 更少的占用内存
体验更好,流畅
2. 在合适的时候,合适的释放系统资源
频繁的释放内存资源,会造成内存抖动,可能会引起anr,ui卡顿,oom等。
3. 在系统内存紧张的情况下,能释放掉大部分不重要的资源,来为Android系统提供可用的内存。
4. 能够很合理的在特殊生命周期中,保存或者还原重要数据,以至于系统能够正确的重新恢复该应用。
4. 内存优化方法
1. 当Service完成任务后,尽量停止它(使用Intentservice代替它,来做耗时操作,同时也能自动退出,而Service不会自动退出)
2、 在UI不可见的时候,释放掉一些只有UI使用的资源(OnTrimMemory优化)
参考:OnTrimMemory优化
3. 在系统内存紧张的时候,尽可能多的释放掉一些非重要资源
同上
4. 避免滥用Bitmap导致的内存浪费
加载合适的分辨率的图片;释放掉那些需要释放的图片;使用LruCache来缓存图片;合理使用软引用
5. 使用针对内存优化过的数据容器
SparseArray替代HashMap;尽量少用枚举(内存占用比正常常量大很多)
6. 避免使用依赖注入的框架
在运行时需要额外需要更多的内存
7. 使用ZIP对其的APK
运行时更少占用内存
8. 使用多进程
定位、推送、webview等,不过这是一把双刃剑。
5. 内存溢出VS内存泄露
1. 内存溢出
最有效的方式,优化图片:压缩图片,使用inBitmap,裁剪,回收
2. 内存泄露
使用Android Monitor;MAT; LeakCanary