缘起
今天及后续几篇关于ART的知识,我将从读书笔记的角度来系统的学习《Advanced Design and Implementation of Virtual Machines》。这一期将重点讲GC的设计。虽然我很不情愿,但是还是要说的一件事情是,这本书绝对不适合初学者。难怪它叫Advanced...。建议买了这本书的同学,如果感到阅读困难的话,不妨跟着我的读书笔记来一步一步深入。
先接着上一期的Exeuction Engine,把最后剩下的JIT和AOT学完。
JIT Compilation
先看思路,JIT的思路是将bytecode转换成可直接执行的机器码,从而消除解释执行。思路很好,现在看,如何确定哪些字节码变成机器码呢?
- Method-BasedJIT:以Java方法为单位,将其编译成机器码。右边有一个VM执行这样一个java方法的流程图。先跳转到JIT-compile,编译完成后将机器码地址挂过去....
- Trace-Based JIT:作者对Trace-Based JIT讲得比较多,而且内容相当复杂(根本就不没有一本书里前几章相对简单的样子,????)。
- Region-Based JIT:和Method-Based JIT类似,但它选取的单位并不是方法。
关于JIT编译,书中内容并不简单,我提取了其中一些值得大家掌握的知识点:
- Method-BaseJIT实现比较方便,但会有存在“鸡犬升天”的情况,即一个方法中其实并不是所有代码都是hot-code,可能只有一部分是。以Method为单位的话,鸡犬升天就无法避免。
- 为什么有一个Region-BasedJIT呢?作者说,Facebook PHP HHVM差不多就是用这个办法,以Basic-Block为单位进行编译。
- 而Android的Dalvik,作者说是traced-basedjit和Region-BaseJIT(Dalvik VM’s trace-based JIT can beconsidered to be a region-based JIT to some extent.)
Android ART采用了Method-Based JIT,但也结合了Trace的情况。对函数调用次数进行统计。正如我在PPT里说的,Trace-Based JIT和Method-Based JIT并不冲突,只是看问题角度不一样而已。而且可以结合起来用。BTW,本书的一个非常鲜明的特点是,很多放在一起做比较的知识观点并不是对立的,而仅仅是角度不同。这一点请各位读者注意。可能高手做到这样子,什么东西都可以 做武器了吧...
论解释执行存在的必要性
作者在这里旗帜鲜明的阐述了解释执行存在的必要性。我觉得这应该是算是关于JVM的common sense了。common sense就是常识,每个人都要了解常识,这样才不会被某些商业/吹牛而误导。作为补刀,我在页面里也写了,请务必仔细看:这是一个事实,即转成机器码,也无法离开VM的支持。典型案例就是,newInstance指令,转成机器码去执行的话也不会它直接就从从OS里分配内存。
AOT Compilation