查看原文
其他

了解一下,Android 10中的ART虚拟机(5)

阿拉神农 神农和朋友们的杂文集 2021-11-05
前言
今天及后续几篇关于ART的知识,我将从读书笔记的角度来系统的学习《Advanced Design and Implementation of Virtual Machines》。这一期将重点讲GC的设计。虽然我很不情愿,但是还是要说的一件事情是,这本书绝对不适合初学者。难怪它叫Advanced...。建议买了这本书的同学,如果感到阅读困难的话,不妨跟着我的读书笔记来一步一步深入。

缘起

今天及后续几篇关于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为单位进行编译。

  • AndroidDalvik,作者说traced-basedjitRegion-BaseJITDalvik 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

微信扫一扫付费阅读本文

可试读14%

微信扫一扫付费阅读本文
: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存