V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wind2412
V2EX  ›  Java

用 C++ 实现了一个 jvm

  •  3
     
  •   wind2412 · 2018-02-05 18:48:40 +08:00 · 7444 次点击
    这是一个创建于 2473 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 和类库。
    • 安装方法:
    1. 仅支持 Linux 以及 macOS 系统,因为底层用了各种操作系统函数,pthread,stat 啥的。我的机器是 mac,所以就不支持 Windows 了。然后呢,我们需要 boost 库。用 brew 安装和 apt-get 啥的,yum 啥的都行。mac 就是 brew install boost,然后 ubuntu 应该是 sudo apt-get install libboost-all-dev。
    2. 这样我们就有了 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 就不知道了。
    3. 然后呢,你需要知道你的 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 中相应位置就可以了。
    4. 于是应该就完事了。直接跑 make -j 8 啥的 8 线程编译就可以。当然如果你是虚拟机,虚拟内存没配置够的话就算了,直接跑 make -j 2 或者 make -j 3 这种就行了。
    5. 之后 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 后缀,参数必须有且仅有一个。
    6. 然后就可以玩了。不过只支持特定实现好的库,你要 socket 什么的都是没有的。不过日后实现看情况可以往上加,你也可以来 pull request 哦。
    7. 如果有 issue 请在 github 上上传 issue。^_^

    注:后来清理了项目,把无用的中文注释全都清理掉了。如果想看到代码细节的各种中文注释,请看这个 commit: https://github.com/wind2412/wind_jvm/tree/9113cb1af484f082f76c1668de3ca970a9c957f1

    32 条回复    2018-02-06 12:07:51 +08:00
    p64381
        1
    p64381  
       2018-02-05 18:56:51 +08:00 via Android
    佩服大佬
    owenliang
        2
    owenliang  
       2018-02-05 19:00:10 +08:00 via Android
    不明觉厉。
    mio4kon
        3
    mio4kon  
       2018-02-05 19:01:08 +08:00
    膜拜大佬
    ChiangDi
        4
    ChiangDi  
       2018-02-05 19:02:46 +08:00
    大佬大佬
    rails3
        5
    rails3  
       2018-02-05 19:03:52 +08:00 via Android
    大佬您好
    waruqi
        6
    waruqi  
       2018-02-05 19:05:29 +08:00 via Android   ❤️ 1
    赞。可以考虑下用 xmake 来维护项目构建哈。: )
    wujunze
        7
    wujunze  
       2018-02-05 19:08:14 +08:00
    很赞 有没有在生产环境用过?
    Cooky
        8
    Cooky  
       2018-02-05 19:08:24 +08:00 via Android
    膝盖给你
    wind2412
        9
    wind2412  
    OP
       2018-02-05 19:08:51 +08:00
    @waruqi 谢谢建议~去学习一番 QAQ
    wind2412
        10
    wind2412  
    OP
       2018-02-05 19:10:35 +08:00
    @wujunze 只是个人玩具项目而已,其实只是为了学习虚拟机原理而写的。和工业级别的没有可比性(
    yhzwy
        11
    yhzwy  
       2018-02-05 19:31:41 +08:00
    dtgio
        12
    dtgio  
       2018-02-05 19:33:09 +08:00 via iPhone
    Mark
    maxco292
        13
    maxco292  
       2018-02-05 19:51:47 +08:00 via Android
    准备 fork 下来看代码
    wweir
        14
    wweir  
       2018-02-05 19:55:00 +08:00 via Android
    服 && 期待 JAVA 实现的版本
    Sanko
        15
    Sanko  
       2018-02-05 20:00:43 +08:00 via Android
    orz
    boywhp
        16
    boywhp  
       2018-02-05 20:02:04 +08:00
    简单翻看了一下, 确实只是一个玩具级别的, C++看着头大
    neilp
        17
    neilp  
       2018-02-05 20:14:35 +08:00
    膝盖.....
    TangMonk
        18
    TangMonk  
       2018-02-05 20:22:14 +08:00 via Android
    牛啊
    Simontune
        19
    Simontune  
       2018-02-05 20:52:19 +08:00
    膜拜大佬
    xrlin
        20
    xrlin  
       2018-02-05 20:57:31 +08:00
    给大佬递茶
    wowo243
        21
    wowo243  
       2018-02-05 20:58:20 +08:00 via Android
    @wweir java 实现的 jvm?
    Applenice
        22
    Applenice  
       2018-02-05 20:59:59 +08:00
    膜拜大佬,马一下
    ERRORatDAY1
        23
    ERRORatDAY1  
       2018-02-05 21:07:15 +08:00 via Android
    膜拜&马克
    cmzy
        24
    cmzy  
       2018-02-05 21:29:26 +08:00
    果然是 V2EX 出人才啊。
    chocotan
        25
    chocotan  
       2018-02-05 21:34:17 +08:00
    这就是大佬
    ylxb23
        26
    ylxb23  
       2018-02-05 22:02:50 +08:00
    请收下我崇敬的眼神
    Jerrymouse1
        27
    Jerrymouse1  
       2018-02-05 22:09:16 +08:00
    好强!!!
    R0ckyY2
        28
    R0ckyY2  
       2018-02-06 04:21:00 +08:00
    真牛逼啊
    agostop
        29
    agostop  
       2018-02-06 09:14:34 +08:00
    都想不通你们哪来这么多时间搞这些事情
    guoyuchuan
        30
    guoyuchuan  
       2018-02-06 09:56:42 +08:00
    双击 66666
    kyokuheishin
        31
    kyokuheishin  
       2018-02-06 11:07:40 +08:00
    dalao
    kylix
        32
    kylix  
       2018-02-06 12:07:51 +08:00
    先 666 再说
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5664 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.