栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM之路(一)编译属于自己的 JDK

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM之路(一)编译属于自己的 JDK

文章目录
  • 一、编译环境及背景
  • 二、上手实操
    • 2.1 下载 JDK 源码
    • 2.2 构建编译环境
      • 2.2.1 GCC编译器
      • 2.2.2 OpenJDK编译依赖库
      • 2.2.3 Bootstrap JDK
    • 2.3 编译操作
  • 三、问题回顾

一、编译环境及背景

本文是参照《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》 周志明老师的书来实践学习的,站在巨人的肩膀上!!

以下是书中与实际操作的环境对比:

实践环境书中环境
系统RHEL8Ubuntu 18.04 LTS
JDKJDK12_06222165c35fJDK12_06222165c35f

因此,在实际操作中会与书中有差异,但差异代表着我需要对每一步操作有更深的理解,排除出现的问题,fighting!!!
着重提一点,源代码目录/doc/building.html 文件或者 building.md 文件强烈推荐看一看,对于编译的理解以及处理不同操作系统环境准备非常有帮助

二、上手实操

我这里将编译 JDK 的步骤分为如下:

  1. 下载 JDK 源码
  2. 安装编译依赖环境与 Boot JDK
  3. 编译操作
2.1 下载 JDK 源码

下载之前首先要区分一下:
https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f :二进制源码
https://jdk.java.net/java-se-ri/12:编译好的 JDK

  1. 进入源码下载网站https://hg.openjdk.java.net/,选择 jdk -> jdk12,点击 browse 查看到的即是源码目录;
  2. 点击左侧的 zip/gz 来下载不同版本的源码压缩包;
压缩包大小
jdk12-06222165c35f.tar.gz103M
jdk12-06222165c35f.zip171M
2.2 构建编译环境

环境分为 GCC 编译器、OpenJDK 编译依赖库、Bootstrap JDK,这一章节如果书中没有设计到你所用系统,请参阅源码目录/doc/building.md

2.2.1 GCC编译器

For apt-based distributions (Debian, Ubuntu, etc), try this:

sudo apt-get install build-essential

For rpm-based distributions (Fedora, Red Hat, etc), try this:

sudo yum groupinstall "Development Tools"
2.2.2 OpenJDK编译依赖库
工具库名称
FreeTypeThe FreeType Project
CUPSCommon UNIX Printing System
X11X Window System
ALSAAdvanced Linux Sound Architecture
libffiPortable Foreign Function Interface Library
AutoconfExtensible Package of M4 Macros

安装命令如下,根据系统版本选择安装

FreeType

  • To install on an apt-based Linux, try running sudo apt-get install libfreetype6-dev.
  • To install on an rpm-based Linux, try running sudo yum install freetype-devel.
  • To install on Solaris, try running pkg install system/library/freetype-2.

CUPS

  • To install on an apt-based Linux, try running sudo apt-get install libcups2-dev.
  • To install on an rpm-based Linux, try running sudo yum install cups-devel.
  • To install on Solaris, try running pkg install print/cups.

X11

  • To install on an apt-based Linux, try running sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev.
  • To install on an rpm-based Linux, try running sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel.
  • To install on Solaris, try running pkg install x11/header/x11-protocols x11/library/libice x11/library/libpthread-stubs x11/library/libsm x11/library/libx11 x11/library/libxau x11/library/libxcb x11/library/libxdmcp x11/library/libxevie x11/library/libxext x11/library/libxrender x11/library/libxrandr x11/library/libxscrnsaver x11/library/libxtst x11/library/toolkit/libxt.

ALSA

  • To install on an apt-based Linux, try running sudo apt-get install libasound2-dev.
  • To install on an rpm-based Linux, try running sudo yum install alsa-lib-devel.

libffi

  • To install on an apt-based Linux, try running sudo apt-get install libffi-dev.
  • To install on an rpm-based Linux, try running sudo yum install libffi-devel.

Autoconf

  • To install on an apt-based Linux, try running sudo apt-get install autoconf.
  • To install on an rpm-based Linux, try running sudo yum install autoconf.
  • To install on macOS, try running brew install autoconf.
  • To install on Windows, try running /setup-x86_64 -q -P autoconf.
2.2.3 Bootstrap JDK

要编译大版本号为 N 的 JDK ,我们还要另外准备一个大版本号至少为 N-1 的、已经编译好的 JDK,因为 OpenJDK 中许多 Java 语言编写的代码需要在编译器执行,所以需要一个编译器可用的 JDK,官方称为 Bootstrap JDK;这里我们需要安装 JDK11

  • To install on an apt-based Linux, try running sudo apt-get install openjdk-11-jdk.
  • To install on an rpm-based Linux, try as below.

因为我使用的是 RHEL8 ,所以我采用一下的方式搜索需要安装版本的:

[root@linuxprobe ~]# dnf search jdk | grep java-11-*		## 查找对应的软件包名
Last metadata expiration check: 8:14:39 ago on Mon 27 Sep 2021 02:27:51 PM CST.
java-11-openjdk.x86_64 : OpenJDK 11 Runtime Environment
java-11-openjdk-demo.x86_64 : OpenJDK 11 Demos
java-11-openjdk-devel.x86_64 : OpenJDK 11 Development Environment
java-11-openjdk-headless.x86_64 : OpenJDK 11 Headless Runtime Environment
java-11-openjdk-javadoc.x86_64 : OpenJDK 11 API documentation
java-11-openjdk-javadoc-zip.x86_64 : OpenJDK 11 API documentation compressed in a single archive
java-11-openjdk-jmods.x86_64 : JMods for OpenJDK 11
java-11-openjdk-src.x86_64 : OpenJDK 11 Source Bundle
java-11-openjdk-static-libs.x86_64 : OpenJDK 11 libraries for static linking

## 这两个包就是我们需要安装的 Bootstrap JDK
dnf install -y java-11-openjdk
dnf install -y java-11-openjdk-devel
2.3 编译操作

将 JDK12 包复制到 linux 目录中(/opt/jvm/),并解压缩;编译操作分为两步,一是环境准备,二是编译 JDK;
configure命令承担了步骤一依赖项检查、参数配置和构建输出目录结构等多项职责,如果编译过程中需要的工具链或者依赖项有缺失,命令执行后将会得到明确的提示,并且给出该依赖的安装命令,属于“友好型”;

在 JDK 目录下运行编译命令:

  1. 编译FastDebug版、仅含Server模式的HotSpot虚拟机:bash configure --disable-warnings-as-errors --enable-debug --with-jvm-variants=server
  2. 编译整个 OpenJDK:make image
[root@linuxprobe jdk12-06222165c35f]# pwd
/opt/jvm/jdk12-06222165c35f
[root@linuxprobe jdk12-06222165c35f]# bash configure --disable-warnings-as-errors --enable-debug --with-jvm-variants=server
[root@linuxprobe jdk12-06222165c35f]# make image

编译后的文件就在 JDK目录/build 下,其文件目录介绍如下:

三、问题回顾
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270447.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号