Android内存优化1-内存原理

要优化内存,先要弄懂android内存体系。

Android内存优化1-内存原理_第1张图片
image.png

计算器:这是线程私有的, 标记线程执行到哪儿了。不会抛出异常

虚拟机栈:线程私有,栈帧用来存放局部变量表 操作数栈 方法出口等。

局部变量表存放了编译器已知的基本数据类型, 对象引用

本地方法栈:主要是native方法执行需要用到的栈

方法区:类信息、常量、静态变量,运行时常量池

运行时常量池记录了编译器的各种字面量和符号引用。

堆: Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,是虚拟机所管理的内存中最大的一块。此内存区域的唯一目的就是【存放对象实例和数组】,几乎所有的对象实例和数组都在这里分配内存。

栈内存的回收:
栈也会内存溢出的,例如你写个递归。java栈内存的内存回收就是利用方法和栈的特性来做的。

基础类型变量仅方法内的局部变量保存在栈内存中,成员变量保存在堆中。

堆内存的回收:
Java的垃圾回收机制GC,GC仅运行在堆内存上,开始学习GC之前你应该知道一个词:stop-the-world。

GC有多种回收算法,但不管哪种回收算法,在GC回收时除了gc所需要的线程外,其他线程都会挂起直到GC结束,GC调优通常就是为了改善stop-the-wrold的时间。

Android Dalvik Heap与原生Java一样,将堆的内存空间分为三个区域,
Young Generation,Old Generation, Permanent Generation。

Android内存优化1-内存原理_第2张图片
AQOUYULE~BL0BO0%6OLJA74.png
  • 最近分配的对象会存放在Young Generation区域,当这个对象经过数次GC后依然存活,它会被移动到Old Generation,最后累积一定时间再移动到Permanent Generation区域。系统会根据内存中不同的内存数据类型分别执行不同的gc操作。
  • 图中的permanent generation称为方法区,其中存储着类和接口的元信息以及interned的字符串信息。所以这一区域并不是为老年代中存活下来的对象所定义的持久区。方法区中也会发生GC,这里的GC同样也被称为major GC

很多手机厂商号称的无卡顿安卓,无非就是利用一些比较成熟的基于统计,机器学习的算法定时清理数据,清理内存,甚至提前加载数据到内存。

你可能感兴趣的:(Android内存优化1-内存原理)