美文网首页JVM大数据Java
深入理解Java虚拟机之自己编译JDK

深入理解Java虚拟机之自己编译JDK

作者: Java弟中弟 | 来源:发表于2022-01-10 13:50 被阅读0次

    题外话

    最近在阅读《深入理解Java虚拟机》,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考!

    前置准备

    平台及工具: Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2)

    OpenJDK12下载地址:
    https://hg.openjdk.java.net/jdk/jdk12/

    • 下载安装解压即可
    深入理解Java虚拟机之自己编译JDK

    编译工具版本推荐:

    • GCC 7.4及以上# Ubuntu上安装GCC命令,该命令默认安装9.3版本(2021年) sudo apt-get install build-essential

    编译依赖库:

    Bootstrap JDK 准备:

    • OpenJDK11sudo apt-get install openjdk-11-jdk

    开始编译

    编译FastDebug版,仅含Server模式的HotSpot虚拟机命令:

    bash configure --enable-debug --with-jvm-variants=server
    
    # 嫌写那么多麻烦,直接用下面这个:point_down:,不过这个是生成release版本的,不利于debug
    bash configure
    

    configure命令会进行依赖项检查,参数配置和构建输出目录结构等操作,所以依赖缺失会得到明确提示:

    深入理解Java虚拟机之自己编译JDK

    ZIP安装命令:

    sudo apt-get install zip
    

    继续检查...继续安装缺失的依赖...

    深入理解Java虚拟机之自己编译JDK

    成功界面:

    深入理解Java虚拟机之自己编译JDK

    依赖检查通过后,执行 make images 命令执行整个OpenJDK的编译,作用是编译出整个JDK镜像

    不出所料,编译报错:

    深入理解Java虚拟机之自己编译JDK

    充分利用了搜索引擎,以及认真阅读了 building.md 文件后,发现应该是gcc的版本问题,默认安装的是9,但实际需要的是7,于是把9给卸载了,重新安装了个7

    # 卸载命令
    sudo apt-get remove gcc-9
    # 安装7
    sudo apt-get install gcc-7
    sudo apt-get install g++-7
    
    # 如果上述命令安装后,gcc --version能查出版本而不会报错,就无需使用以下命令
    # 或者已有7和9两个版本,但默认用的是9,也可用以下命令修改为7
    
    # 设置默认选项
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
    sudo update-alternatives --config gcc
    
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
    sudo update-alternatives --config g++
    
    深入理解Java虚拟机之自己编译JDK

    万事俱备只欠东风。先 make dist-clean 清理一波编译生成的临时文件,接着一波流:

    bash configure --enable-debug --with-jvm-variants=server
    make images
    

    漫长的等待后...没有报错!!!

    测试一波:

    ./build/*/images/jdk/bin/java -version
    

    编译成功:

    深入理解Java虚拟机之自己编译JDK

    目录结构:

    深入理解Java虚拟机之自己编译JDK

    在IDE工具上调试

    导入JDK源码文件,open file 选择 MakeFile ,有弹窗清除 clean ,然后一直确认即可

    深入理解Java虚拟机之自己编译JDK

    等待导入......

    接着会发现帮你生成了一堆的 targets ,将根目录Mark Directory as 一下

    深入理解Java虚拟机之自己编译JDK

    然后选 all 即可,打开编辑,Executable选择编译出来的 java 命令,Before launch移除 Build

    具体设置各项参数如图:

    深入理解Java虚拟机之自己编译JDK

    找到 java.c 文件,打个断点,直接 Debug 启动(开始你的表演):

    深入理解Java虚拟机之自己编译JDK

    配置 -version 只是测试一下是不是真的能够调试了而已,如果想要调试某个Java类呢

    深入理解Java虚拟机之自己编译JDK

    IDEA配合Clion远程调试

    IDEA配置

    • 添加Configuration,选择Remote JVM Debug即可:
    深入理解Java虚拟机之自己编译JDK

    Clion配置

    • 添加Configuration,选择Custom Build Configuration
    • Target 需要添加一下,make编译配置make clean配置
    • Executable依然选择编译出来的Java命令
    • Program arguments填写:-jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008 xxx.jar
    • Working directory选择:上述jar包生成位置

    最终配置如图:

    深入理解Java虚拟机之自己编译JDK

    参考资料

    《深入理解Java虚拟机:JVM高级特性与最佳实践》(第三版)1.6实战:自己编译JDK

    相关文章

      网友评论

        本文标题:深入理解Java虚拟机之自己编译JDK

        本文链接:https://www.haomeiwen.com/subject/lbpmcrtx.html