• 深入理解 JVM 之——动手编译 JDK


    更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验

    本篇为深入理解 Java 虚拟机第一章的实战内容,推荐在学习前先掌握基础的 Linux 操作、编译原理基础以及扎实的 C/C++ 功底。

    该系列的 GitHub 仓库:https://github.com/Doge2077/learn-jvm


    构建编译环境


    系统准备


    在官方文档上要求编译 OpenJDK 至少需要 2~4GB 的内存空间(CPU核心数越多,需要的内存越大),而且至少要 6~8GB 的空闲磁盘空间,不要看 OpenJDK 源码的大小只有不到 600MB,要完成编译,过程中会产生大量的中间文件,并且编译出不同优化级别(Product、FastDebug、SlowDebug)的 HotSpot 虚拟机可能要重复生成这些中间文件,这都会占用大量磁盘空间。

    参考我的虚拟机配置如下:

    • VM 虚拟机 Ubuntu20.04

    • 处理器 8 核,内存 8G,硬盘 40G

    注意:所有文件所在目录都不能包含中文。


    环境准备


    下载 JDK12 源码:

    wget https://hg.openjdk.org/jdk/jdk12/archive/06222165c35f.tar.gz
    
    • 1

    通过 Mercurial 代码版本管理工具从 Repository 中直接取得源码

    hg clone https://hg.openjdk.java.net/jdk/jdk12
    
    • 1

    解压:

    tar xvf 06222165c35f.tar.gz
    
    • 1

    安装 GCC 编译器:

    sudo apt-get install build-essential
    
    • 1

    安装后执行:

    gcc -v
    
    • 1

    如果版本为 gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) ,版本太高会导致后面编译失败,需要卸载重装 gcc

    sudo apt-get remove gcc
    
    • 1

    安装 gcc-7

    sudo apt-get install gcc-7
    sudo apt-get install g++-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++
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再次执行 gcc -v 可以看到版本为 gcc version 7.5.0 (Ubuntu 7.5.0-6ubuntu2) 即可。

    进入解压后的 jdk12-06222165c35f 目录 ,安装在编译过程中需要的依赖 FreeTypeCUPS 等若干第三方库:

    sudo apt-get install libfreetype6-dev
    sudo apt-get install libcups2-dev
    sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
    sudo apt-get install libasound2-dev
    sudo apt-get install libffi-dev 
    sudo apt-get install autoconf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装启动 JDK

    sudo apt-get install openjdk-11-jdk
    
    • 1

    进行编译


    在解压后的 jdk12-06222165c35f 目录下,执行:

    bash configure --enable-debug --with-jvm-variants=server
    
    • 1

    如果缺少未安装的库,根据报错提示安装即可,成功后显示:

    image-20230829164908588

    然后,编译,启动!

    make images
    
    • 1

    打开资源管理查看进程,可以看到八核线程汗液狂飙(

    image-20230829165553313

    经过长达十分钟左右的等待后,可以看到编译如下信息,提示编译成功:

    Finished building target 'images' in configuration 'linux-x86_64-server-fastdebug'
    
    • 1

    linux-x86_64-server-fastdebug 目录即为我们编译后的 JDK 目录,我们进入然后执行:

    java -version
    
    • 1

    可以看到编译后的 JDK 默认会带上编译的机器名:

    image-20230829170644862

    然后我们就可以对着 JDK 进行激情乱搞了(bushi


    在 Clion 中调试


    连接到虚拟机


    Windows Terminalcmd 中执行:

    ipconfig
    
    • 1

    记录本机 IPv4 地址 xxx.xxx.xxx.xxx

    在虚拟机 Terminal 中执行:

    ifconfig
    
    • 1

    记录虚拟机虚拟机的 ens33:inet 地址 yyy.yyy.yyy.yyy

    若提示 ifconfig not found 则执行 sudo apt install net-tools 安装即可。

    然后打开编辑栏的虚拟网络编辑服务器:

    image-20230829224327986

    选择NAT 模式连接,进入 NAT 设置,添加:

    image-20230829224523863

    弹出的映射传入端口中:

    • 主机端口,默认是 22
    • 虚拟机地址填写 yyy.yyy.yyy.yyy
    • 虚拟机端口,默认 22

    通过上述步骤,我们就成功将主机 xxx.xxx.xxx.xxx:22 与 虚拟机 yyy.yyy.yyy.yyy:22 映射到了一起。

    之后进行 ssh 登录即可连接,若需要继续配置免密登录,可以参考教程:ssh 登录和 scp 传输


    Clion 导入项目


    建议安装 JetBrains Gateway 进行操作,当然你也可以直接使用 Clion 进行导入,步骤是一样滴(

    打开 Clion 在远程登录选择 SSH 进行新建项目:

    image-20230829225754109

    首次连接需要选择连接的服务器:

    image-20230829225910639

    我们新建一个连接,左上角 + 号新建配置,之后填入虚拟机的 ip 以及登录用户:

    image-20230829230037546

    密码验证方式可以自行选择,最后测试连接,连接成功后选择 Makefile 文件导入,然后连接即可:

    image-20230829231215443

    由于我安装了 JetBrains Gateway,所以最终看起来是酱紫:

    image-20230829231825275

    到这一步,恭喜你可以开始愉快的玩耍了(xjbg


  • 相关阅读:
    grid弹性布局 设置宽高一致
    腾讯云服务器初始化
    【软件教程】如何用C++交叉编译出能在Android运行的ELF程序或so动态库
    Pytorch的数据操作(预备知识)
    基于Open3D的点云处理4-数据结构Kdtree和Octree
    【干货分享】.NET人脸识别解决方案
    c++小知识
    软件测试学习(一)基础概念、实质、说明书测试、分类、动态黑盒测试
    含文档+PPT+源码等]精品基于Java的社区团购系统SSM[包运行成功]Java毕业设计SSM项目源码
    Android毕业论文选题基于Uniapp实现的在线投票App问卷调查
  • 原文地址:https://blog.csdn.net/LYS00Q/article/details/132572226