1、为什么要进行内存优化
OOM导致崩溃
app性能,流畅度问题,会使得界面卡顿
2、内存分配与回收方式(GC机制)
引用摘录自 Android 优化二 Java内存分配机制及内存泄漏
JVM内存分配策略
方法区:
主要存放静态数据、全局的static数据和一些常量。
堆和栈:
1.局部变量的基本数据类型和引用,存储于栈中,引用的对象实体存储于堆中。因为它们属于方法中的变量,生命周期随方法而结束。
2.成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体),因为它们属于类,类对象终究是要被new出来使用的。
GC机制
回收机制
是从程序的主要运行对象(如静态对象/寄存器/栈上指向的堆内存对象等)开始检查引用链,当遍历一遍后得到上述这些无法回收的对象和他们所引用的对象链,组成无法回收的对象集合,而其他孤立对象(集)就作为垃圾回收
GC监听:
1.系统每进行一次GC操作时,都会在LogCat中打印一条日志
日志的基本格式如下
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time>
第一部分GC_Reason,这个是触发这次GC操作的
第二部分Amount_freed,表示系统通过这次GC操作释放了多少内存
第三部分Heap_stats中会显示当前内存的空闲比例以及使用情况(活动对象所占内存 / 当前程序总内存)
第四部分Pause_time表示这次GC操作导致应用程序暂停的时间。关于这个暂停的时间,Android在2.3的版本当中进行过一次优化,在2.3之前GC操作是不能并发进行的,也就是系统正在进行GC,那么应用程序就只能阻塞住等待GC结束。虽说这个阻塞的过程并不会很长,也就是几百毫秒,但是用户在使用我们的程序时还是有可能会感觉到略微的卡顿。而自2.3之后,GC操作改成了并发的方式进行,就是说GC的过程中不会影响到应用程序的正常运行,但是在GC操作的开始和结束的时候会短暂阻塞一段时间,不过优化到这种程度,用户已经是完全无法察觉到了
2.OnTrimMemory回调,当内存快要不足的时候通知要做操作
3.回收算法 主要针对堆中进行GC
新生代 停止-复制(Stop-and-copy)清理法
老年代 标记-整理算法
永久代
3、内存限制
4、内存优化方式
数据结构优化
- 频繁的字段连接使用StringBuilder
- ArrayMap、SparseArray替换HashMap
- 内存抖动:大量的请求一次性的对象,申请完释放又申请又释放,导致gc不能及时回收
对象复用
- 复用系统自带资源
- ListView等中的ConvertView复用
- 避免在onDraw方法中执行对象的创建
5、oom优化
强引用、软引用的使用
临时bitmap的及时回收
避免bitmap的浪费
try catch某些大内存分配的操作
加载bitmap:缩放比例、解码格式、局部加载
内存泄漏
非静态内部类、匿名类
单例导致的内存泄漏
需要手动关闭的对象没有关闭
资料
Android 内存管理
Android性能优化(三)之内存管理
Java 分代收集算法
Android内存管理机制及优化方法
Android内存泄漏场景及解决方法