知识卡片

先借用已有的运行时把新运行时编译出来,再让它接管自己——解决"自己实现自己"的悖论

专业/工作

内容

用Java写一个Java虚拟机,天然存在一个先有鸡还是先有蛋的悖论:这段Java代码本身要跑起来,也需要一个Java虚拟机。Jikes RVM的解法是借用一个已经存在的、用C写成的JVM,先在它上面编译并执行Jikes RVM自己的代码,把结果(代码、数据、以及垃圾收集器需要的根映射信息)整体保存成一份”启动镜像”文件;然后一个专门的加载器把这份镜像直接加载进内存的指定区域,Jikes RVM就从这份镜像里”醒来”,开始独立运行、不再需要最初那个C写的JVM。这是一种通用的自举模式:当一个系统的实现依赖它自身尚不存在的能力时,可以借助一个外部的、已经成熟的等价系统完成第一次构建,把构建结果封装成可独立加载的快照,之后系统就能靠这份快照摆脱对外部工具的依赖,自己运行自己。

参考来源

《架构之美》第10章《元循环虚拟机的力量:Jikes RVM》