学习JVM最好的方法,就是实现它,没有之一。
对JVM感兴趣的朋友可能会去主动寻找讲解JVM的书,比如《深入理解JVM》、《Java虚拟机规范》、《虚拟机的设计与实现》,但是这些书都是定性讲解,多数人看过以后对不少概念还是会很模糊,其根本原因就是我们无法只根据定义在脑袋里想象出具体用代码应该怎么实现,就会有一种空中楼阁的感觉。既然虚拟机规范都是公开的,为什么我们不尝试着去实现一个能跑就行的JVM呢?
方法论:将复杂问题化解为简单问题的集合
国外有一本著名的操作系统教材,叫作《Operating Systems: Three Easy Pieces》,读过的朋友一定会对内容的通俗易懂印象深刻,因为作者总是先从一种最简单的情况入手,然后逐步考虑更多的情况,最后扩展到实际问题。Oracle的Hotspot JVM实现是极其复杂的,如果打个比喻的话,我认为可以类比成美国已经退役的航天飞机,都是巨型工程。因此仅凭一己之力想实现完整JVM是很难的,必须将复杂的问题简化,然后各个击破。 比如,垃圾回收可以直接利用Golang自身回收机制,线程可以映射到golang的协程,native方法可以用开发语言直接实现,可以先不实现类,可以先不调用方法等等。当把最简单的零件实现以后,再拼凑起来实现更复杂的功能。这样一来,我们可以把实现JVM这个艰巨的任务分解成以下步骤:
-
从classpath中读取class文件
-
解析class文件
-
实现解释器
其中解释器的实现可以根据字节码含义的复杂程度循序渐进的去做:
- <