当前位置: 首页 > 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;让你享受更好的音质…...

git -- 替换项目已经存在的 git 远程仓库地址

要将项目中的 Git 远程仓库地址修改为新的地址&#xff08;http://192.168.3.32:9980/java/transketch-portal-backend&#xff09;&#xff0c;你可以按照以下步骤操作&#xff1a;方法一&#xff1a;使用 Git 命令行打开终端或命令提示符导航到你的项目目录运行以下命令&…...

HunyuanVideo-Foley私有部署全攻略:RTX4090D专用优化,轻松搭建AI视频生成环境

HunyuanVideo-Foley私有部署全攻略&#xff1a;RTX4090D专用优化&#xff0c;轻松搭建AI视频生成环境 在AI视频生成领域&#xff0c;最令人沮丧的莫过于看着别人的演示视频效果惊艳&#xff0c;而自己却卡在环境配置和模型部署的泥潭中。从CUDA版本冲突到显存不足崩溃&#xf…...

Python自动化办公:3种PDF水印处理技巧(附完整代码)

Python自动化办公&#xff1a;3种PDF水印处理技巧&#xff08;附完整代码&#xff09; 在数字化办公场景中&#xff0c;PDF文档的水印处理已成为高频需求。无论是合同归档需要添加版权标识&#xff0c;还是内部文件流转需清除敏感标记&#xff0c;传统手动操作既耗时又易出错。…...

Redis 集群模式:核心问题与深度运维指南

前言&#xff1a;为什么要写这篇笔记&#xff1f;在最近的一次技术面试中&#xff0c;面试官问到了“Redis 集群模式下的常见问题及解决方案”。坦白说&#xff0c;虽然我在项目中一直使用 Redis&#xff0c;但由于现有的业务规模尚未达到触发集群极端瓶颈的程度&#xff0c;导…...

百度快速排名优化技术(百度seo排名优化)

百度快速排名优化技术是一种针对搜索引擎结果页面&#xff08;SERP&#xff09;排名优化的技术手段&#xff0c;通过优化网站的内容、结构和用户体验等方面&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而获得更多的流量和潜在客户。下面&#xff0c;我将介绍百度快速…...

云原生实战:如何用GROUP模型提升容器工作负载预测准确率(附避坑指南)

云原生实战&#xff1a;如何用GROUP模型提升容器工作负载预测准确率&#xff08;附避坑指南&#xff09; 在云原生架构中&#xff0c;容器资源管理一直是DevOps团队面临的重大挑战。传统单容器预测方法往往忽视了微服务间复杂的协同关系&#xff0c;导致预测误差居高不下。本文…...

以太网MAC与PHY接口技术详解

以太网PHY、MAC及其通信接口技术解析1. 以太网接口架构概述1.1 基本组成结构以太网接口电路从硬件角度可分为两大核心组件&#xff1a;MAC控制器&#xff08;Media Access Control&#xff09;&#xff1a;负责数据链路层的媒体访问控制PHY芯片&#xff08;Physical Layer&…...

后端/全栈/架构师转战AI大模型开发:可落地规划(建议收藏)

如果你本身是后端、全栈或架构师出身&#xff0c;就意味着你已经手握一套扎实的“确定性系统”构建能力——分布式部署、高并发处理、数据库事务管控、系统稳定性保障&#xff0c;这些都是你转型AI大模型开发的核心底牌&#xff0c;也是纯算法出身从业者难以快速补齐的短板。 而…...

DBA_RECYCLEBIN purge指定日期前的表

SummaryHow to purge DBA_RECYCLBIN for objects older than x days/minutes? or do we have RECYCLEBIN RETENTION feature or truncate recyclebin ?--------------------------------------------------------------------------------------DBA_RECYCLEBIN has a column …...

Android开机向导定制实战:从源码分析到禁用状态栏的隐藏技巧

Android开机向导深度定制&#xff1a;从源码解析到状态栏控制实战 第一次接触Android开机向导定制时&#xff0c;我被这个看似简单却隐藏复杂逻辑的系统组件深深吸引。作为设备初始化的第一道门户&#xff0c;开机向导不仅承载着用户体验的第一印象&#xff0c;更是厂商品牌展示…...