做 Java 开发的同学,以及其他使用基于 JVM 的编程语言,都或多或少的了解过 JVM 的一些知识,例如类加载器,  class 文件的结构与解析,以及 JVM 指令等内容。


这些内容在了解和学习时,我一般是看一些 JVM 的规范、深入 Java 虚拟机这一类的书籍,以及一些前人总结的优质文章。这些书和文章质量都比较高,但有个问题也很明显:这些内容中都是总结或者结论,比较概括。而对于想从基础开始,或者喜欢从实战入手的朋友,就稍显不适应。


就好比一本武功秘籍写道「四两拨千斤」。我们理解上只能意会到用比较轻的力,撬动了很重的东西。那如果这个时候能有个辅助说明,「向来的力一侧,用三成内力 ...」那就更详细。如果此时再有个手把手的师傅教学一下,那理解则会更快更深刻。


在某本书里看过这样一个例子:


某国际大学里分两组进行陶器制作实验,第一组不允许看书,每天都用土进行器具制作。当然因为没有相关知识,泥软硬控制不好,器具烧裂等。而第二组则从一开始就从基础的理论学起,之后又参观各类制作精良的器具。对于如何制作,他们胸有成竹。

快要结课的时候两个组每个人都需要制作一件器具,哪个组作品做的更好呢?


竟然是第一个组,这种来自真实的经验,通过多次实践,这种「Get hands dirty」的学习方式获胜。


duang!  一个同学扔来砖头。说了这么多,和JVM学习有半毛钱关系么?


别急,这就回到我们的 JVM 学习的话题。比如说解析 class文件, 我们看规范知道哪些位置知道存储的是类与方法签名,以及对应的的修饰符,哪些是常量区的内容。比如我们学习类加载器,看书会了解到BootStrap加载器,App加载器,Ext加载器,这些内容到合上书,还有多少能在我们「制作自己的器具」时能马上浮现在脑海?多少还是有些纸上谈兵。


如果以 Get your hands dirty 的方式,我们自己写一个 超简易的 JVM, 首先加上类加载器功能,这个时候首先需要根据不同的 classpath 进行查找,自然会了解不同的类加载器,同时对于类加载器的双亲委托也会理解的很深刻。 那加载到的 class 文件只是一个 InputStream, 怎样将其转成一个 Class 呢? 就会涉及到class 文件的解析。那这个时候你怎么会不了解「CAFEBABE」呢?


「快别BB了,到底想说啥?」,另一个同学高叫着。


其实是最近在图书馆看到一本书,读了一部分感觉不错,推荐给各位。 也就是荐书


书是这本:

自己动手写Java虚拟机』。

学习Java虚拟机也许这是最好的方法_java


目前我看了前三章,这种通过「造轮子」来了解轮子的知识,个人认为很适合学习。 


有些书评认为此书写的较浅显,实现的JVM也不完整。但我认为,学习这种事情,在书的思路中,每一章是可以扩展的啊。比如在看此书的解析 class 文件章节,是不是可以顺手比对着看下 JVM 规范,顺道看看 ASM/BCEL/Javassist这类操作字节码的工具是怎么工作的,知识一下子就丰富了。


此外,这种「造」的方式学习,比干巴巴的理解要容易的多。而在造出来轮子后,对于整个轮子,不再是一种远观的方式,而是了解其背后的一些原理,在扩展到其他相关主题的内容上时,也好理解的多。


当然,对于一些从事JVM开发,甚至靠啃OpenJDK的源码和规范习得内功的朋友,这种老司机可能不认为这种方式好。所以所谓的最好,其实都是因人而异。欢迎其他老司机们留言发表下你认为最好的学习方式。