一.Dalvik虚拟机&ART虚拟机与Hotspot区别
Dalvik是一款不是JVM的JVM虚拟机,本质上他没有遵循JVM规范,不能直接运行java.class文件,他的结构是基于寄存器结构,而不是JVM栈架构。执行的是编译后的dex文件,执行效率高,在Android5.0后被ART替换。
二.Andoid与Java体系对比
1.java体系:
java语言的推广-->跨平台
2.Android体系:
设备目标明确,不依赖于硬件,我的硬件体系已经确定。
三.ART堆的详细划分
android对于内存的使用场景对比于JVM有区别,区别在于数据种类比较多:java c bitmap 预先编译后的代码。
1.Image Space:
连续地址空间,不进行垃圾回收,存放系统预加载类
2.Zycote Space:
连续地址空间,进行垃圾回收,管理Zygote进程在启动过程中预加载和创建的各种对象。
注意:Image Space和Zygote Space 进程和应用程序进程之家进行共享,而Allocate Space就每个进程都独立拥有一份。虽然Image Space和Zygote Space 都是Zygote进程和应用程序进程之间进行共享,但是前者的对象只创建一次,后者的对象需要在系统每次启动时根据运行情况都重新创建一遍。
3.Allocation Space:
在Zygote进程fork第一个子进程之前,就会把Zygote Space一分为二。原来已经被使用的那部分堆还叫Zygote Space,而未使用的那部分堆,就叫Allocation Space,以后的对象都在Allcation Space上分配。
4.LargeObject Space:
离散地址空间,进行垃圾回收,用来分配一些大于12k的大对象。
a.对象大小大于12K。
b.原子类型数组。byte数组,int数组。
四.ART于Dalvik
Dalivk虚拟机执行的dex字节码,解释执行。在程序运行的过程中选择热点代码(经常执行的代码)进行编译或者优化。
ART虚拟机执行的是本地机器码。在程序安装的过程中编译成本地机器码。
五.Android N的运作方式
ART使用预先编译(AOT),导致程序安装慢。
1.最初安装应用时,不会进行任何AOT编译(安装又快了),运行过程中解释执行。对经常执行的方法进行JIT,经过JIT编译的方法会记录了到Profile配置文件中。
2.当设备闲置和充电时,编译守护进程会执行,根据Profie文件堆常用代码进行AOT编译,待下次运行时 直接使用。
六.ART的GC策略
1.Sticky GC:值回收上一次GC到本次GC之间申请的内存。
2.Partial GC:局部垃圾后收,除了ImageSpace和Zygote Space空间之外的内存垃圾。
3.Full GC: 全局垃圾回收,除了ImageSpace之外的内存垃圾。
GC暂停时间:Sticky GC < Paitial GC < Full GC
垃圾回收效率:Sticky GC > Paitial GC > Full GC
七.分配对象时执行GC的三个阶段
区别于JVM,Android采取我们的最大限度保证不进行OOM充分利用每一份空间.
1.看空间够不够,不够,浮游GC一次。
2.不够,局部GC一次。
3.不够,Full GC一次。
4.还不够,扩容。
5.还不够,软引用回收。
6.OOM
当内存使用在85%左右,就会出现频繁GC现象。