当前位置: 首页 > news >正文

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


相关文章:

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

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 本篇为深入理解 Java 虚拟机第一章的实战内容,推荐在学习前先掌握基础的 Linux 操作、编译原理基础以及扎实的 C/C 功底。 该系列的 GitHub 仓库:https://github.com/Doge2077/lear…...

[移动通讯]【Carrier Aggregation in LTE】【 Theory + Log analysis-1】

CA: Carrrier Aggregation PCC: Primary Component Carrier SCC: SCC Secondary Component Carrier 目录: 背景介绍 PCC & SCC 聚合方式 Precondition for CA 一 背景介绍 在没有CA 技术前,手机和基站以单子载波的方式,收发…...

Sui诚邀您参加KBW「首尔Web3之夜」

韩国区块链周(KBW)是由FACTBLOCK创办,Hashed联合主办的年度盛会。今年的KBW将于9月4–10日在韩国首尔举办。作为亚洲最具影响力的Web3行业盛会之一,KBW将汇聚业界优秀的参与者和先驱者,共同探讨区块链行业的未来。 Su…...

19.CSS雨云动画特效

效果 源码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Cloud & Rain Animation</title><link rel="stylesheet" href="style.css"> </head> <bo…...

第61步 深度学习图像识别:多分类建模(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 截至上期&#xff0c;我们一直都在做二分类的任务&#xff0c;无论是之前的机器学习任务&#xff0c;还是最近更新的图像分类任务。然而&#xff0c;在实际工作中&#xff0c;我们大概率需要进行多分类任务。例如肺部胸片可不仅仅能诊断…...

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…...

ThinkPHP 文件上传 fileSystem 扩展的使用

ThinkPHP 文件上传 ThinkPHP 文件上传 扩展 filesystem一、安装 FileSystem 扩展二、认识 filesystem 配置文件 config/filesystem.php三、上传验证&#xff08;涉及到验证器的知识点&#xff09;四、文件上传demo ThinkPHP 文件上传 扩展 filesystem ThinkPHP 为我们 提供了 …...

液体神经网络LLN:通过动态信息流彻底改变人工智能

巴乌米克泰吉 一、说明 在在人工智能领域&#xff0c;神经网络已被证明是解决复杂问题的非常强大的工具。多年来&#xff0c;研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络&#xff08;LNN&#xff09;的概念&#xff0c;这是一个利用动态计算…...

2023年的今天,PMP项目管理认证还值得考吗?

首先我肯定它值得考&#xff0c;PMP认证的教材和考纲都会随着项目管理工具和市场趋势而更新&#xff0c;不用担心会过时。 PMP项目管理认证是什么&#xff1f; 英文全称是Project Management Professional&#xff0c;中文全称叫做项目管理专业人士资格认证。它是由美国项目管…...

【JavaSE专栏91】Java如何主动发起Http、Https请求?

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN学院、蓝桥云课认证讲师。 主打方向&#xff1a;Vue、SpringBoot、微信小程序 本文讲解了如何使用…...

给oracle逻辑导出clob大字段、大数据量表提提速

文章目录 前言一、大表数据附&#xff1a;查询大表 二、解题思路1.导出排除大表的数据2.rowid切片导出大表数据Linux代码如下&#xff08;示例&#xff09;&#xff1a;Windows代码如下&#xff08;示例&#xff09;&#xff1a;手工执行代码如下&#xff08;示例&#xff09;&…...

研发规范第九讲:通用类命名规范(重点)

研发规范第九讲&#xff1a;通用类命名规范&#xff08;重点&#xff09; 无规范不成方圆。我自己非常注重搭建项目结构的起步过程&#xff0c;应用命名规范、模块的划分、目录&#xff08;包&#xff09;的命名&#xff0c;我觉得非常重要&#xff0c;如果做的足够好&#xff…...

python+django+协同过滤算法-基于爬虫的个性化书籍推荐系统(包含报告+源码+开题)

为了提高个性化书籍推荐信息管理的效率&#xff1b;充分利用现有资源&#xff1b;减少不必要的人力、物力和财政支出来实现管理人员更充分掌握个性化书籍推荐信息的管理&#xff1b;开发设计专用系统--基于爬虫的个性化书籍推荐系统来进行管理个性化书籍推荐信息&#xff0c;以…...

系统架构:软件工程

文章目录 资源知识点自顶向下与自底向上形式化方法结构化方法敏捷方法净室软件工程面向服务的方法面向对象的方法快速应用开发螺旋模型软件过程和活动开放式源码开发方法功用驱动开发方法统一过程模型RUP基于构件的软件开发UML 资源 信息系统开发方法 知识点 自顶向下与自底…...

泰迪大数据实训平台产品介绍

大数据产品包括&#xff1a;大数据实训管理平台、大数据开发实训平台、大数据编程实训平台等 大数据实训管理平台 泰迪大数据实训平台从课程管理、资源管理、实训管理等方面出发&#xff0c;主要解决现有实验室无法满足教学需求、传统教学流程和工具低效耗时和内部教学…...

Linux- 文件夹相关的常用指令

1. 统计文件夹下的文件数量 在 Linux 下&#xff0c;有几种方法可以统计文件夹下的文件数量&#xff1a; 使用 ls 和 wc 命令&#xff1a; 这种方式可以统计目录下的直接子文件&#xff08;不包括子目录里的文件&#xff09;。 ls -l <目录路径> | wc -l注意&#xff1a…...

在 macOS 中安装 TensorFlow 1g

tensorflow 需要多大空间 pip install tensorflow pip install tensorflow Looking in indexes: https://pypi.douban.com/simple/ Collecting tensorflowDownloading https://pypi.doubanio.com/packages/1a/c1/9c14df0625836af8ba6628585c6d3c3bf8f1e1101cafa2435eb28a7764…...

数学建模:CRITIC赋权法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 CRITIC赋权法 算法流程 构建原始数据矩阵 X X X&#xff0c;他是一个 m ∗ n m * n m∗n 的矩阵&#xff0c; m m m 表示评价对象个数&#xff0c; n n n 表示指标个数对原始数据矩阵进行正向化处理计算…...

Facebook message tag 使用攻略

Messenger 讯息传不出去&#xff1f;无法发送FB 讯息给非好友&#xff1f; 2020年3月&#xff0c;Facebook 为了防止用户被过多的推广或垃圾讯息困扰而更新使用条款&#xff0c;现在商家要用FB传讯息给所有人&#xff08;包括非好友&#xff09;&#xff0c;应该使用 Facebook …...

气传导耳机哪个品牌比较好?综合表现很不错的气传导耳机推荐

​气传导耳机不仅能够提升幸福感还能听到周围环境声&#xff0c;大大提高安全性。如果你在寻找一款高品质的气传导耳机&#xff0c;又不知从何入手时&#xff0c;不要担心&#xff0c;我已经为你精心挑选了四款市面上综合表现很不错的气传导耳机&#xff0c;让你享受更好的音质…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...