独立型 JVM 和寄生型 JVM 比较
/ / 点击 / 阅读耗时 3 分钟本文系 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的对象模型。 |
参考
全文完。