Android 内存管理方式

1、为什么要进行内存优化

OOM导致崩溃
app性能,流畅度问题,会使得界面卡顿

2、内存分配与回收方式(GC机制)

引用摘录自 Android 优化二 Java内存分配机制及内存泄漏

JVM内存管理.png

JVM内存分配策略

方法区:

主要存放静态数据、全局的static数据和一些常量。

堆和栈:

1.局部变量的基本数据类型和引用,存储于栈中,引用的对象实体存储于堆中。因为它们属于方法中的变量,生命周期随方法而结束。
2.成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体),因为它们属于类,类对象终究是要被new出来使用的。

GC机制

回收机制

是从程序的主要运行对象(如静态对象/寄存器/栈上指向的堆内存对象等)开始检查引用链,当遍历一遍后得到上述这些无法回收的对象和他们所引用的对象链,组成无法回收的对象集合,而其他孤立对象(集)就作为垃圾回收

GC监听:
1.系统每进行一次GC操作时,都会在LogCat中打印一条日志

日志的基本格式如下
D/dalvikvm: , ,
第一部分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优化

强引用、软引用的使用


image.png

临时bitmap的及时回收
避免bitmap的浪费
try catch某些大内存分配的操作
加载bitmap:缩放比例、解码格式、局部加载

内存泄漏

非静态内部类、匿名类
单例导致的内存泄漏
需要手动关闭的对象没有关闭

资料

Android 内存管理
Android性能优化(三)之内存管理
Java 分代收集算法
Android内存管理机制及优化方法
Android内存泄漏场景及解决方法

你可能感兴趣的:(Android 内存管理方式)