俯瞰Java 虚拟机

||  横看成峰侧成岭,远近高低各不同。-- 苏轼



近十年来,在编程语言领域,从1995年Java 语言的发布到日渐变的火热, Java 虚拟机(JVM)  也同时受到了极大的关注。这其中不仅有 Java 虚拟机的开发者,还包括从普通的 Java 开发者,到其它像 Scala、Kotlin、Jython等「JVM语言」的开发者。


而在近几年「面试造火箭」的形势下,JVM 也是个必考的点,区别只是难和更难。


这其中, Oracle 的 HotSpot 虚拟机做为官方出品,受到了最多的关注。 市面上反响不错的几本书籍也都是从深入理解 HotSpot的角度在。


俗话说不想当厨子的裁缝不是个好司机,苏先生也说过一句很棒的话:「横看成峰侧成岭,远近高低各不同」,有些时候,我们太过于关注一种 JVM 的实现,或者只是从 JVM 规范的角度去理解虚拟机。

但具体规范为什么要这样规定,规范里比较宽松的部分,各个实现厂商为什么要采用这种方式实现,反而容易一头雾水。

每种实现,在更大的范围里,通用语言虚拟机里是怎样考虑的,是特定实现还是通用实现;甚至在计算机的视角,虚拟机到底虚拟了什么呢?

可能站在使用者的角度看,是一种理解,站在虚拟机的设计者、架构师的视角,看到的就从特定组件的细节中脱离出来,了解组件间、模块化、体系结构的设计。在习惯了从语言使用者的角度出发时,站远点儿,飞高点儿,观一观全貌,能更好的理解。


今天咱们要说的这本『虚拟机设计与实现-以JVM为例』就是这样一本,既能带你深入到虚拟机的底层细节,又能站的远一点,角度高一点,以JVM为例,俯瞰通用语言虚拟机的设计。


作者做为 Apache Harmony 开源 JVM 的主要贡献者,不仅有对虚拟机领域的研究,还有真实的工程的一手经验,所以关于虚拟机设计,在说明白是什么的同时,也能清楚的告诉你为什么。不光是庖丁解牛,还有高屋建瓴。相信看过书之后,你也会认同。


虚拟机是什么?虚拟了什么呢?

对应真实计算机系统,开篇作者就从虚拟机的类型出发,给我们介绍了完整的指令集架构(ISA)、ABI虚拟机、虚拟ISA等,给我们指出 JVM 具体是哪个类型,虚拟了什么,为什么需要虚拟机,在 Write Once, Run anywhere之外,给你更多的认识。


然后从虚拟机内部的核心组件,虚拟机中的数据结构概览,作者层层深入,到虚拟机核心组件的设计部分,像执行引擎的设计,对象的分配与垃圾回收,再到虚拟机内的线程设计,VM的线程与 OS 的线程是如何映射,线程安全以及GC的线程如何工作等。


在此之上,深入虚拟机内部,介绍对于本地接口、垃圾回收、栈展开等方面的支持。以及对于垃圾回收与线程交互的优化。


可能单独拿任何一个概念来说,并不新鲜,但每个概念、原理与设计,书中都辅以图和伪代码的形式,让读者能多 get 到一些信息,力透纸背。

在说垃圾回收的时候,除了有各类GC回收算法外,还按【移动式GC与非移动式GC】的角度,来讨论这些回收算法的优劣,以及像线程局部分配(HotSPot 里的TLAB)、跳增指针分配(HotSpot 里的 bump pointer)。


再比如异常的抛出,作者从指令控制流的角度,以正常执行流的转移为目标,描述抛出异常的抛出上下文的保存、栈轨迹的保存、异常处理器寻找、控制 转移,从前到后,感觉脉络清晰,也很新奇。这也是我的公众号一直以来努力追求的,力图通过文章给读者更多的信息,或者对事物理解的新的角度。


书中在介绍概念时,有些会介绍其对应操作系统里是怎样的概念,不过这一部分一般是一两句话,对于熟悉的朋友可以快速进行知识迁移。当然这也相当于指明了一条参考阅读的路径。比如像上面说的异常抛出类似于操作系统的信号机制。更前面提到的 VM的线程与OS 的线程映射与调度等等。


书里以JVM 为例,写出了不少同类书籍中较少见的内容,像栈展开、运行时辅助等,图文并茂,循序渐进,在书里我想你一定也能发现不一样的风景,到时候记得回来给我留言哦




最后,好书怎么能少得了抽奖呢。今天的奖品来自本书的出版社,人民邮电图灵教育出版社,感谢图灵一直以来的支持。这本书确实很不错,喜欢的朋友也可以直接买,先睹为快。

抽奖送两本,文末留言点赞最高的送一本。时间截止 5.27 晚8:00。

祝大家阅读都有收获。



对了,朋友请留步,我这儿还有一个当当的优惠码FDTDYD:(200减30),全品类通用,先享受当当每满100-50的基础上,实付金额超过200就可叠加使用,相当于170元买400元的书,数量有限,省点儿书钱又能买本好书。