美文网首页
JVM学习笔记之动手编译JDK【一】

JVM学习笔记之动手编译JDK【一】

作者: JiaJianHuang | 来源:发表于2020-11-29 17:20 被阅读0次

    动手编译 JDK

    以下编译的版本是 JDK13,环境为 Deepin15.11

    一、下载源码

    第一种方式:  Mercurial 版本控制获取源码,下载速度极慢(不推荐)

    1.1 安装 Mercurial

    # 其它系统请看: https://www.mercurial-scm.org/wiki/TutorialInstall
    #https://www.mercurial-scm.org/wiki/Download
    #注意python版本Python 2.7.13, 不能高于python3
    #可以试用sudo update-alternatives --config python切换python版本
    sudo apt-get install mercurial
    

    1.2 下载源码

    #像从github一样,拷贝仓库文件
    hg clone http://hg.openjdk.java.net/jdk/jdk13 jdk13
    cd jdk13/
    #赋予脚步执行权限
    chmod +x get_source.sh
    #执行脚步
    sh ./get_source.sh
    

    第二种:直接下载源码包 zip

    可以从以下来两个渠道下载源码压缩包

    二、编译源码

    以下的编译源码选择第二种方式:

    2.1 下载 openJDK

    #编译的JDK13
    wget -c https://hg.openjdk.java.net/jdk/jdk13/archive/tip.zip -O jdk13-src.zip
    
    #Bootstrap JDK
    (注意Bootstrap JDK版本要求:编译OpenJDK 12时,Bootstrap JDK必须使用JDK 11及之后的版本)
    wget -c https://download.java.net/openjdk/jdk12/ri/openjdk-12+32_linux-x64_bin.tar.gz
    

    2.2 开始编译

    编译的文档:https://hg.openjdk.java.net/jdk/jdk13/file/0368f3a073a9/doc/building.md

    • 编译硬件要求

      • 建议尽量在 Linux 或者 MacOS 上构建 OpenJDK
      • 推荐在 SSD 硬盘中进行构建
      • 要求编译 OpenJDK 至少需要 2 ~ 4GB 的内存空间(CPU 核心数越多,需要的内存越大),而且至少要 6 ~ 8GB 的空闲磁盘空间
      • 如果需要编译 32 位版本,推荐在 64 位(32 位系统受 4G 内存限制)的操作系统上进行,可以通过编译参数(--with-target-bits=32)来指定需要生成 32 位编译结果
    • OpenJDK 编译依赖库

      #安装GCC
      sudo apt-get install build-essential
      #安装FreeType
      sudo apt-get install libfreetype6-dev
      #安装CUPS
      sudo apt-get install libcups2-dev
      #安装X11
      sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
      #安装ALSA
      sudo apt-get install libasound2-dev
      #安装libffi
      sudo apt-get install libffi-dev
      #安装Autoconf
      sudo apt-get install autoconf
      
    • 解压下载的 openjdk 源码

    unzip jdk13-src.zip -d ~/IdeaProjects/JDK/
    tar -zxvf  openjdk-12+32_linux-x64_bin.tar.gz -C ~/IdeaProjects/JDK/jdk12
    
    cd ~/IdeaProjects/JDK/
    mv jdk13-0368f3a073a9/  jdk13
    
    
    • 进行编译配置
    cd ~/IdeaProjects/JDK/jdk13
    
    # 查看编译参数
    ./configure --help
    
    #开始编译
    ./configure \
    --with-target-bits=64 \
    --with-boot-jdk="../jdk-12" \
    --with-jvm-variants=server \
    --disable-warnings-as-errors  \
    --with-debug-level=slowdebug 2>&1 | tee configure_mac_x64.log
    
    #--with-boot-jdk="../../jdk-12" :指定BootJDK
    #--with-debug-level=<level> :release、fastdebug、slowde-bug,越往后进行的优化措施就越少,带的调试信息就越多。默认值为release
    #--with-target-bits=<bits>:指明要编译32位还是64位的Java虚拟机
    #--with-jvm-variants=<variant>[,<variant>...]:编译特定模式(Variants)的HotSpot虚拟机,可以多个模式并存,可选值为server、client、minimal、core、zero、custom。
    
    configure-jdk.png
    • 执行编译
    # 详细make请看:
    #https://github.com/openjdk/jdk/blob/master/doc/building.md#running-make
    export LANG=C
    #如果需要再次配置 configure,先执行以下命令
    make clean && make dist-clean
    #执行整个OpenJDK编译
    make images
    
    //编译后产生的目录
    |-- buildtools  //用于生成、产生编译过程中用到的工具
    |-- configure-support  //用于存放configure、make、test的临时文件
    |-- hotspot   //虚拟机编译的中间文件
    |-- images  //使用make *-images产生的镜像存放的位置
    |-- jdk   //编译后产生的jdk
    |-- make-support
    `-- support  //编译时产生的中间文件
    
    
    • 测试编译好的 JDK
    cd ./build/linux-x86_64-server-slowdebug/images/jdk/bin
    ./java -version
    
    //输出
    openjdk version "13-internal" 2019-09-17
    OpenJDK Runtime Environment (slowdebug build 13-internal+0-adhoc.hdj.jdk13)
    OpenJDK 64-Bit Server VM (slowdebug build 13-internal+0-adhoc.hdj.jdk13, mixed mode, sharing)
    

    三、运行 Java 程序

    3.1 编写 HelloWorld.java

    /**
     * @author huangjiajian
     */
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("HelloWorld !");
        }
    }
    
    

    3.2 使用编译好的 JDK 运行

    cd /home/hdj/IdeaProjects/JDK/jdk13/build/linux-x86_64-server-slowdebug/images/jdk/bin
    #编译
    ./javac /home/hdj/IDEA/Java-Learning/src/main/java/cn/hdj/jvm/compilejdk/HelloWorld.java
    #运行
    ./java -classpath "/home/hdj/IDEA/Java-Learning/src/main/java/"  \
        cn.hdj.jvm.compilejdk.HelloWorld
    

    四、使用 IntellJ Clion 调试源码

    4.1 下载 Clion

    • 导入编译好的 JDK 源码
    clion-import-jdk.png
    • 在 CMakeLists.txt 里面添加一些根路径
    # 根据自己导入的路径来
    
    #添加一些根路径
    include_directories(./src/hotspot/share)
    include_directories(./src/hotspot/cpu/x86)
    include_directories(./src/hotspot/share/utilities)
    include_directories(./src/hotspot/share/precompiled)
    
    • 在 src/hotspot/share/precompiled/precompiled.hpp, 手动追加导入头文件
    # include <cstdlib>
    # include <cstdint>
    # include "register_x86.hpp"
    # include "assembler_x86.hpp"
    # include "globalDefinitions.hpp"
    # include "globalDefinitions_x86.hpp"
    # include "assembler_x86.hpp"
    #include <stubRoutines_x86.hpp>
    

    4.2 进行调试

    • 在 Run/Debug Configurations 中增加一个 CMake Application
    • Executable 选择我们刚才编译出来的 FastDebug 或者 SlowDebug 版的 java 命令
    • 运行参数加上-version 或者某个 Class 文件的路径
    • 把 Before launch 里面的 Build 去掉
    • 在 src/hotspot/share/prims/jni.cpp 文件中,打上断点
    • 运行调试
    image-20201129153338306.png image-20201129154100394.png
    • 注意:

      如果 debug 过程出现错误,需要告知编译器忽略错误,继续 debug

      • debugger: 是 LLDB,输入 process handle SIGSEGV --stop=false 即可,这里告诉编译器忽略错误
      • debugger:是 GDB ,点击输入 handle SIGSEGV pass noprint nostop 即可
    image-20201129162820882.png

    到此,动手编译 JDK 完成了

    参考

    相关文章

      网友评论

          本文标题:JVM学习笔记之动手编译JDK【一】

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