本文系 R 大在 2013 年在 ITEYE 高级语言虚拟机论坛的开坑之作,即便是现在看来还是有很大的启发意义,于是整理了一下。

独立型 JVM

有些项目是明确希望最终能得到一个可以独立运行的JVM,那就不得不做出一些取舍:必须要有编译到机器码的编译器,并且要能直接跟外部代码打交道(以实现JNI之类的功能)。Jikes RVM及衍生版MRP、Maxine VM、joeq、JNode都是此类。下文把这种叫做“独立型”。

寄生型 JVM

也有些项目纯粹是玩票的,像Sun在90年代末做的JavaInJava,或者在其之后MIT做的Rivet JVM,或者最近一些的M-JVM。它们只能在已有的JVM(称为宿主JVM)上运行。这样的JVM可以只用Java写的解释器来实现。下文把这种叫做“寄生型”。

区别

独立型 寄生型
GC 独立型meta-JVM需要一些magic来穿透Java的语义而直接访问内存内容,以便实现GC。 寄生型则好办,直接交由低下的宿主JVM来解决即可
对象模型 独立型meta-JVM对对象模型、对象布局都有完全控制。 寄生型则必须用Java对象来模拟Java对象。直观的模拟方式可以用Map系或者数组(Object[])系。
类加载器 独立型可以完全自己实现类加载器。 寄生型通常会混合着使用自己实现的类加载器和宿主JVM的类加载器。
JNI 独立型需要自己实现JNI但受限制较少。 寄生型通常要借助宿主JVM来实现JNI,这样就迫使Java对象在通过JNI跑到native code之前,要先从寄生JVM的对象模型转换为宿主JVM的对象模型。

参考