Android客户端ART虚拟机执行篇笔记|青训营笔记

355 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第九天。这篇笔记主要是对安卓客户端“打开ART虚拟机的大门”这节课中执行篇的记录。


笔记

执行篇

ART的执行方式

执行方式:(其中解释执行由解释器完成,JIT和OAT采用的是编译之后,此时执行的已经是指令了。

解释执行--dex code

JIT--profile--JIT compile--JIT code

AOT--speed-profile--dex2oat--AOT code

JIT

JIT是just in time的缩写,也就是即时编译。它是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。当写好一个Java程序后,源语言的语句将由Java编译器编译成字节码,而不是编译成与某个特定的处理器硬件平台对应的指令代码。

AOT

AOT是ahead of time的缩写。和JIT不同,AOT是在程序运行之前,对APK中的函数进行编译。

1.和程序是否运行无关。

2.编译的范围不是以函数为单位,而是以dex为单位的。

3.结果会持久化。

延迟绑定

绑定的越迟,动态性越好,性能越差;绑定的越早,动态性越差,性能越好

栈管理

ART对于解释执行和编译后指令采用两种不同的策略:

1.对于解释执行,栈托管到虚拟机完成。

2.对于编译后的,压栈处理和native代码是一样的,遵从对应指令集的约定。

不同执行方式之间的切换

对于AOT,IT到解释执行,或者反之的调用,ART采用trampoline-bridge机制来进行切换。

synchronize机制

JAVA引入了Sync机制,让我们加锁解锁很方便。

主要作用:

  1. 原子性:确保线程互斥的访问同步代码;
  2. 可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的;
  3. 有序性:有效解决重排序问题,即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作”。

胖锁和瘦锁

胖锁: 费劲,但是响应快;实现上采用spinlock

瘦锁: 省力。但是反应慢;实现上采用mutelock

总结

通过这一部分的学习,我了解到了Android客户端中ART虚拟机的执行方式的有关知识,包括JIT、AOT等方式,延迟绑定,栈管理的两种策略,胖瘦锁等知识,更加系统更深入地了解了这方面的知识。