JVM学习笔记之动手编译JDK【一】

动手编译 JDK

以下编译的版本是 JDK13,环境为 Deepin15.11

一、下载源码

第一种方式:  Mercurial 版本控制获取源码,下载速度极慢(不推荐)

1.1 安装 Mercurial

# 其它系统请看: https://www.mercurial-scm.org/wiki/TutorialInstall
#https://www.mercurial-scm.org/wiki/Download
#注意python版本Python 2.7.13, 不能高于python3
#可以试用sudo update-alternatives --config python切换python版本
sudo apt-get install mercurial

1.2 下载源码

#像从github一样,拷贝仓库文件
hg clone http://hg.openjdk.java.net/jdk/jdk13 jdk13
cd jdk13/
#赋予脚步执行权限
chmod +x get_source.sh
#执行脚步
sh ./get_source.sh

第二种:直接下载源码包 zip

可以从以下来两个渠道下载源码压缩包

二、编译源码

以下的编译源码选择第二种方式:

2.1 下载 openJDK

#编译的JDK13
wget -c https://hg.openjdk.java.net/jdk/jdk13/archive/tip.zip -O jdk13-src.zip

#Bootstrap JDK
(注意Bootstrap JDK版本要求:编译OpenJDK 12时,Bootstrap JDK必须使用JDK 11及之后的版本)
wget -c https://download.java.net/openjdk/jdk12/ri/openjdk-12+32_linux-x64_bin.tar.gz

2.2 开始编译

编译的文档:https://hg.openjdk.java.net/jdk/jdk13/file/0368f3a073a9/doc/building.md

  • 编译硬件要求

    • 建议尽量在 Linux 或者 MacOS 上构建 OpenJDK
    • 推荐在 SSD 硬盘中进行构建
    • 要求编译 OpenJDK 至少需要 2 ~ 4GB 的内存空间(CPU 核心数越多,需要的内存越大),而且至少要 6 ~ 8GB 的空闲磁盘空间
    • 如果需要编译 32 位版本,推荐在 64 位(32 位系统受 4G 内存限制)的操作系统上进行,可以通过编译参数(--with-target-bits=32)来指定需要生成 32 位编译结果
  • OpenJDK 编译依赖库

    #安装GCC
    sudo apt-get install build-essential
    #安装FreeType
    sudo apt-get install libfreetype6-dev
    #安装CUPS
    sudo apt-get install libcups2-dev
    #安装X11
    sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
    #安装ALSA
    sudo apt-get install libasound2-dev
    #安装libffi
    sudo apt-get install libffi-dev
    #安装Autoconf
    sudo apt-get install autoconf
    
  • 解压下载的 openjdk 源码

unzip jdk13-src.zip -d ~/IdeaProjects/JDK/
tar -zxvf  openjdk-12+32_linux-x64_bin.tar.gz -C ~/IdeaProjects/JDK/jdk12

cd ~/IdeaProjects/JDK/
mv jdk13-0368f3a073a9/  jdk13

  • 进行编译配置
cd ~/IdeaProjects/JDK/jdk13

# 查看编译参数
./configure --help

#开始编译
./configure \
--with-target-bits=64 \
--with-boot-jdk="../jdk-12" \
--with-jvm-variants=server \
--disable-warnings-as-errors  \
--with-debug-level=slowdebug 2>&1 | tee configure_mac_x64.log

#--with-boot-jdk="../../jdk-12" :指定BootJDK
#--with-debug-level=<level> :release、fastdebug、slowde-bug,越往后进行的优化措施就越少,带的调试信息就越多。默认值为release
#--with-target-bits=<bits>:指明要编译32位还是64位的Java虚拟机
#--with-jvm-variants=<variant>[,<variant>...]:编译特定模式(Variants)的HotSpot虚拟机,可以多个模式并存,可选值为server、client、minimal、core、zero、custom。
configure-jdk.png
  • 执行编译
# 详细make请看:
#https://github.com/openjdk/jdk/blob/master/doc/building.md#running-make
export LANG=C
#如果需要再次配置 configure,先执行以下命令
make clean && make dist-clean
#执行整个OpenJDK编译
make images

//编译后产生的目录
|-- buildtools  //用于生成、产生编译过程中用到的工具
|-- configure-support  //用于存放configure、make、test的临时文件
|-- hotspot   //虚拟机编译的中间文件
|-- images  //使用make *-images产生的镜像存放的位置
|-- jdk   //编译后产生的jdk
|-- make-support
`-- support  //编译时产生的中间文件

  • 测试编译好的 JDK
cd ./build/linux-x86_64-server-slowdebug/images/jdk/bin
./java -version

//输出
openjdk version "13-internal" 2019-09-17
OpenJDK Runtime Environment (slowdebug build 13-internal+0-adhoc.hdj.jdk13)
OpenJDK 64-Bit Server VM (slowdebug build 13-internal+0-adhoc.hdj.jdk13, mixed mode, sharing)

三、运行 Java 程序

3.1 编写 HelloWorld.java

/**
 * @author huangjiajian
 */
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("HelloWorld !");
    }
}

3.2 使用编译好的 JDK 运行

cd /home/hdj/IdeaProjects/JDK/jdk13/build/linux-x86_64-server-slowdebug/images/jdk/bin
#编译
./javac /home/hdj/IDEA/Java-Learning/src/main/java/cn/hdj/jvm/compilejdk/HelloWorld.java
#运行
./java -classpath "/home/hdj/IDEA/Java-Learning/src/main/java/"  \
    cn.hdj.jvm.compilejdk.HelloWorld

四、使用 IntellJ Clion 调试源码

4.1 下载 Clion

  • 导入编译好的 JDK 源码
clion-import-jdk.png
  • 在 CMakeLists.txt 里面添加一些根路径
# 根据自己导入的路径来

#添加一些根路径
include_directories(./src/hotspot/share)
include_directories(./src/hotspot/cpu/x86)
include_directories(./src/hotspot/share/utilities)
include_directories(./src/hotspot/share/precompiled)
  • 在 src/hotspot/share/precompiled/precompiled.hpp, 手动追加导入头文件
# include <cstdlib>
# include <cstdint>
# include "register_x86.hpp"
# include "assembler_x86.hpp"
# include "globalDefinitions.hpp"
# include "globalDefinitions_x86.hpp"
# include "assembler_x86.hpp"
#include <stubRoutines_x86.hpp>

4.2 进行调试

  • 在 Run/Debug Configurations 中增加一个 CMake Application
  • Executable 选择我们刚才编译出来的 FastDebug 或者 SlowDebug 版的 java 命令
  • 运行参数加上-version 或者某个 Class 文件的路径
  • 把 Before launch 里面的 Build 去掉
  • 在 src/hotspot/share/prims/jni.cpp 文件中,打上断点
  • 运行调试
image-20201129153338306.png
image-20201129154100394.png
  • 注意:

    如果 debug 过程出现错误,需要告知编译器忽略错误,继续 debug

    • debugger: 是 LLDB,输入 process handle SIGSEGV --stop=false 即可,这里告诉编译器忽略错误
    • debugger:是 GDB ,点击输入 handle SIGSEGV pass noprint nostop 即可
image-20201129162820882.png

到此,动手编译 JDK 完成了

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 1.借鉴: 给Ubuntu10.10配置可用源 Ubuntu14.04下编译JDK7 ubuntu14.0...
    孙瑞锴阅读 340评论 0 0
  • 什么是编译? 把一个源程序翻译成目标程序的工作过程。 什么是编译JDK JDK中包含着JAVA的运行环境(JVM+...
    2ba1e04cc031阅读 1,053评论 0 2
  • jdk1.7编译环境 JVM源码—教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看) - 左潇龙 - 博客...
    lesline阅读 1,197评论 1 0
  • JDK发布至今,大家的使用方式基本是从官网下载一个版本,然后直接安装(windows)或者解压至指定的目录,配置环...
    两句挽联阅读 4,987评论 1 51
  • 编译前准备 1. 下载openjdk。 官方建议是使用Mercurial来下载代码,Mercurial是一款免费的...
    山间听雨者阅读 1,867评论 0 0