这是我参与「第四届青训营」笔记创作活动的第九天。这篇笔记主要是对安卓客户端“打开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机制,让我们加锁解锁很方便。
主要作用:
- 原子性:确保线程互斥的访问同步代码;
- 可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的;
- 有序性:有效解决重排序问题,即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作”。
胖锁和瘦锁
胖锁: 费劲,但是响应快;实现上采用spinlock
瘦锁: 省力。但是反应慢;实现上采用mutelock
总结
通过这一部分的学习,我了解到了Android客户端中ART虚拟机的执行方式的有关知识,包括JIT、AOT等方式,延迟绑定,栈管理的两种策略,胖瘦锁等知识,更加系统更深入地了解了这方面的知识。