深入理解 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

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

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

解压:

tar xvf 06222165c35f.tar.gz

安装 GCC 编译器:

sudo apt-get install build-essential

安装后执行:

gcc -v

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

sudo apt-get remove gcc

安装 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++

再次执行 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

安装启动 JDK

sudo apt-get install openjdk-11-jdk

进行编译


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

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

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

image-20230829164908588

然后,编译,启动!

make images

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

image-20230829165553313

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

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

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

java -version

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

image-20230829170644862

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


在 Clion 中调试


连接到虚拟机


Windows Terminalcmd 中执行:

ipconfig

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

在虚拟机 Terminal 中执行:

ifconfig

记录虚拟机虚拟机的 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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/93934.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table实现纯前端导出(适用于el-table任意表格)

2023.9.1今天我学习了如何使用el-table实现前端的导出功能,该方法的好处有无论你的el-table长什么样子,导出之后就是什么样子。 1.安装三个插件 npm install file-save npm install xlsx npm install xlx-style 2.创建Export2Excel.js // 根据dom导出表…

el-date-picker自定义只能选中当前月份和半年内月份等

需求:el-date-picker只能选中当前月期和当前月期往前半年,其他时间就禁用了不让选择了,因为没数据哈哈。当然也可以选择往前一年等。 一、效果 二、写个日期选择器 :picker-options:日期选项 value-format:选择后的格…

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

案例背景 最近总看到《消失的她》票房多少多少,《孤注一掷》票房又破了多少多少..... 于是我就想自己爬虫一下获取中国高票房的电影数据,然后分析一下。 数据来源于淘票票:影片总票房排行榜 (maoyan.com) 爬它就行。 代码实现 首先爬虫获…

【CSS】CSS 特性 ( CSS 优先级 | 优先级引入 | 选择器基本权重 )

一、CSS 优先级 1、优先级引入 定义 CSS 样式时 , 可能出现 多个 类型相同的 规则 定义在 同一个元素上 , 如果 CSS 选择器 相同 , 执行 CSS 层叠性 , 根据 就近原则 选择执行的样式 , 如 : 出现两个 div 标签选择器 , 都设置 color 文本颜色 ; <style>div {color: re…

react17:生命周期函数

挂载时更新时 setState触发更新、父组件重新渲染时触发更新forceUpdate触发更新卸载时 react&#xff08;v17.0.2&#xff09;的生命周期图谱如下。 相较于16版本&#xff0c;17版本生命周期函数有如下变化&#xff1a; componentWillMount() componentWillUpdate() compone…

无涯教程-Android - Frame Layout函数

Frame Layout 旨在遮挡屏幕上的某个区域以显示单个项目&#xff0c;通常&#xff0c;应使用FrameLayout来保存单个子视图&#xff0c;因为在子视图彼此不重叠的情况下&#xff0c;难以以可扩展到不同屏幕尺寸的方式组织子视图。 不过&#xff0c;您可以使用android:layout_grav…

Mybatis学习|基本的crud、数据库字段与对照类字段不一致问题

1.查询&#xff1a;根据id去查用户 在Dao层的UserMapper接口中增加根据id查用户的方法&#xff0c;定义方法名、传的参数以及返回值 在与UserMapper接口绑定的UserMapper.xml中配置该方法对应的sql语句 编写测试用例 2.增加&#xff1a;插入一个新用户 在Dao层的UserMapper接…

统一使用某一个包管理工具,比如yarn pnpm

原因&#xff1a;前端每个人的习性不一样&#xff0c;有人用npm 有人用yarn等包管理工具&#xff0c;混合下载插件容易出bug&#xff0c;就用个小工具锁住就行了&#xff0c;只能使用yarn或者pnpm反向下载依赖和下载插件。不然就报错 1.在项目主目录下创建preinstall.js // 如…

关于两个不同数据库的两张表建立数据库链接,关联查询数据

一、数据库链接 数据库链接&#xff08;database link&#xff09;是用于跨不同数据库之间进行连接和数据传输的工具或方法。它允许在一个数据库中访问另一个数据库中的对象和数据。 二、具体操作 以Oracle数据库为例 --1.建立链接tjpt CREATE DATABASE LINK tjpt CONNECT…

vscode远程调试PHP代码

目录 一、VScode配置 1.1安装vscode里面的两个扩展 1.2安装对应PHP版本的xdebug 二、ssh连接和xdebug配置 2.1ssh连接 2.2xdebug配置 三、xdebug调试&#xff0c;访问 一、VScode配置 1.1安装vscode里面的两个扩展 1.2安装对应PHP版本的xdebug 去xdebug官方&#xff0c…

机器学习:无监督学习

文章目录 线性学习方法聚类ClusteringKmeansHAC 分布表示降维PCAMatrix FactorizationManifold LearningLLELaplacian Eigenmapst-SEN 线性学习方法 聚类Clustering Kmeans 随机选取K个中心&#xff0c;然后计算每个点与中心的距离&#xff0c;找最近的&#xff0c;然后更新中…

Flutter开发- iOS 问题CocoaPods not installed or not in valid state

解决问题方案&#xff1a; 1、先检查本机CocoaPods是否安装&#xff0c;通过gem list 查看是否安装 打开终端&#xff0c;执行gem list&#xff0c;出现图中的数据即为已安装。未安装看第4 步 2、已经安装了CocoaPods&#xff0c;还出现了图中的提示&#xff0c;你可能已经猜…