Android JVM04 --- App调优与ART虚拟机

193 阅读3分钟

一.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现象。