wind jvm:一个 java 虚拟机( C++)
- 地址: https://github.com/wind2412/wind_jvm
- 知乎链接: https://zhuanlan.zhihu.com/p/32443204
- 简介:使用了我写过的 javap 项目(地址: https://github.com/wind2412/javap )作为 classfile parser。依照 java 虚拟机规范(基于 java 8 )、参考了部分 hotspot 源码以及 dalvik vm 源码,拟实现了 klass-oop 对象二分模型、multithread (支持多线程 java 类库)、异常处理( try-catch 以及调用栈回溯)、反射机制(较多支持 jdk 反射库)、虚函数表调用以及接口函数调用( invokeVirtual 以及 invokeInterface )、简单的 invokedynamic 动态调用(支持 jdk lambda 表达式类库)、stop-the-world gc 特性、并发下的垃圾回收( GC-Root 算法以及 GC 复制算法)等。随着开发可以支持更多 native library 和类库。
- 安装方法:
- 仅支持 Linux 以及 macOS 系统,因为底层用了各种操作系统函数,pthread,stat 啥的。我的机器是 mac,所以就不支持 Windows 了。然后呢,我们需要 boost 库。用 brew 安装和 apt-get 啥的,yum 啥的都行。mac 就是 brew install boost,然后 ubuntu 应该是 sudo apt-get install libboost-all-dev。
- 这样我们就有了 boost 支持了。于是我们应该去 Makefile 修改一下,因为我配置的是我机器的环境,而且没用 cmake。所以要手动修改,把我机器上的 boost 路径目录换成你的就可以了。比如如果是 mac 的话,把 ifeq 中的 $(CC) $(LINK_FLAGS) -L/usr/local/Cellar/boost/1.60.0_2/lib/ .... 里边的目录换成你自己的就行。如果是 linux,就把 else 中的 $(CC) $(LINK_FLAGS) -L/usr/lib/x86_64-linux-gnu/ 换成你自己的。不过如果是 ubuntu,八成不需要改,因为目录的版本无关。其他的 linux 就不知道了。
- 然后呢,你需要知道你的 jdk class 文件路径。mac 上,一般在 /Library/Java/JavaVirtualMachines/jdk1.8xxx.jdk/Contents/Home/jre/lib/ 下的 rt.jar 文件。如果是 linux,一般在 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ 下。配置到 config.xml 中相应位置就可以了。
- 于是应该就完事了。直接跑 make -j 8 啥的 8 线程编译就可以。当然如果你是虚拟机,虚拟内存没配置够的话就算了,直接跑 make -j 2 或者 make -j 3 这种就行了。
- 之后 bin 目录会出现 wind_jvm 这个 executable file。注意:一定要在 wind_jvm/ 目录运行 ./bin/wind_jvm Test1 这样的命令。因为内部我的 system lib path 是通过当前路径来获取的。如果不在 wind_jvm/ 目录下跑,就应该会报错。然后我给了十几个 TestX.java 文件,执行 make test 就能编译。有一个 Test7.java 是不行的。那个只有 debug version jvm 的工具才能编译。所以我编译好了直接放上去了。然后运行 ./bin/wind_jvm Test1 这种命令就好。不加 .class 后缀,参数必须有且仅有一个。
- 然后就可以玩了。不过只支持特定实现好的库,你要 socket 什么的都是没有的。不过日后实现看情况可以往上加,你也可以来 pull request 哦。
- 如果有 issue 请在 github 上上传 issue。^_^
注:后来清理了项目,把无用的中文注释全都清理掉了。如果想看到代码细节的各种中文注释,请看这个 commit: https://github.com/wind2412/wind_jvm/tree/9113cb1af484f082f76c1668de3ca970a9c957f1
