Dalvik虚拟机
执行的是dex字节码,解释执行,从Android2.2版本开始,支持JIT编译(Just In Time)在程序运行的过程中进行选择热点代码(经常执行的代码)编译或优化。应用的安装会执行一次优化,将dex字节码优化成odex文件
ART虚拟机
在Android4.4引入开发者选项,在Android5.0及高版本默认Android中运行。执行的是本地机器码。APK仍然是包含dex字节码的文件。应用安装过程,将字节码翻译成本地机器码。 引入了预先编译机制(Ahead Of Time)安装的时候用自带的dex2oat工具将dex中的字节码编译成本地的机器码。 在Android5.0 6.0 引入的ART虚拟机以及本地机器码,绕过了解释执行,提高运行效率,但安装变慢问题。在Android7.0进行了优化,采用混合编译方式。
ART相对Dalvik垃圾回收的改进
- 将GC停顿由2次改为1次
- 仅有一次的GC停顿中进行并行处理
- 特殊场景下,对于近期创建较短生命周期的对象消耗更短的时间进行垃圾回收
- 改进垃圾收集的功效,更频繁的执行并行垃圾收集
- 后台进程的内存在垃圾回收过程进行压缩以解决碎片化问题
JVM内存分配原理:
JVM对象分配原则
- 对象优先在Eden分配
- 空间分配担保
- 大对象直接进入老年代
- 长期存活的对象进入老年代
- 动态对象年龄判定
JVM整体申请内存空间流程
- 先去Eden区看是否有足够的空间
- 有,直接分配
- 无,JVM开始回收垃圾对象,回收完成后,判断Eden是否有足够空间
- 有,直接分配
- 无,s区域是否有足够空间
- 有,Eden区的存活对象移动到s区,新对象就可以在Eden申请成功
- 无,启用担保机制,old区是否足够空间
- 有,将s区存活的对象移动到old区,Eden将存活对象放到s区,申请成功
- 无,JVM触发full gc,gc之后查看old区是否有足够空间
- 有,将s区的存活对象移动到old区,Eden将存活对象放到s区,申请成功
- 无,OOM