题外话

最近在阅读《深入理解Java虚拟机》,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考!

前置准备

平台及工具:Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2)

OpenJDK12下载地址:https://hg.openjdk.java.net/jdk/jdk12/

  • 下载安装解压即可

编译工具版本推荐:

  • GCC 7.4及以上

    # Ubuntu上安装GCC命令,该命令默认安装9.3版本(2021年)
    sudo apt-get install build-essential

编译依赖库:

工具 库名称 安装命令
FreeType The FreeType Project sudo apt-get install libfreetype6-dev
CUPS Common UNIX Printing System sudo apt-get install libcups2-dev
X11 X Window System sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
ALSA Advanced Linux Sound Architecture sudo apt-get install libasound2-dev
libffi Portable Foreign Function Interface Library sudo apt-get install libffi-dev
Autoconf Extensible Package of M4 Macros sudo apt-get install autoconf

Bootstrap JDK 准备:

  • OpenJDK11

    sudo apt-get install openjdk-11-jdk

开始编译

编译FastDebug版,仅含Server模式的HotSpot虚拟机命令:

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

# 嫌写那么多麻烦,直接用下面这个,不过这个是生成release版本的,不利于debug
bash configure

configure命令会进行依赖项检查,参数配置和构建输出目录结构等操作,所以依赖缺失会得到明确提示:

ZIP安装命令:

sudo apt-get install zip

继续检查...继续安装缺失的依赖...

成功界面:

依赖检查通过后,执行make images命令执行整个OpenJDK的编译,作用是编译出整个JDK镜像

不出所料,编译报错:

充分利用了搜索引擎,以及认真阅读了building.md文件后,发现应该是gcc的版本问题,默认安装的是9,但实际需要的是7,于是把9给卸载了,重新安装了个7

# 卸载命令
sudo apt-get remove gcc-9
# 安装7
sudo apt-get install gcc-7
sudo apt-get install g++-7 # 如果上述命令安装后,gcc --version能查出版本而不会报错,就无需使用以下命令
# 或者已有7和9两个版本,但默认用的是9,也可用以下命令修改为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++


万事俱备只欠东风。先make dist-clean清理一波编译生成的临时文件,接着一波流:

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

漫长的等待后...没有报错!!!

测试一波:

./build/*/images/jdk/bin/java -version

编译成功:

目录结构:

在IDE工具上调试

导入JDK源码文件,open file 选择MakeFile,有弹窗清除clean,然后一直确认即可

等待导入......

接着会发现帮你生成了一堆的targets,将根目录Mark Directory as 一下

然后选all即可,打开编辑,Executable选择编译出来的java命令,Before launch移除Build

具体设置各项参数如图:

找到java.c文件,打个断点,直接Debug启动(开始你的表演):

配置-version只是测试一下是不是真的能够调试了而已,如果想要调试某个Java类呢

IDEA配合Clion远程调试

IDEA配置

  • 添加Configuration,选择Remote JVM Debug即可:

Clion配置

  • 添加Configuration,选择Custom Build Configuration

  • Target 需要添加一下,

    • make编译配置

    • make clean配置

  • Executable依然选择编译出来的Java命令

  • Program arguments填写:

    -jar
    -Xdebug
    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008
    xxx.jar
  • Working directory选择:上述jar包生成位置

最终配置如图:

参考资料

《深入理解Java虚拟机:JVM高级特性与最佳实践》(第三版)1.6实战:自己编译JDK

深入理解Java虚拟机之自己编译JDK的更多相关文章

  1. 深入理解Java虚拟机 #01# 自己编译JDK

    x 首先用书上的脚本尝试,失败. 之后根据源文件的 README 编译,抛出: root@linux:/opt/openjdk# sh ./get_source.sh ERROR: Need init ...

  2. 深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  3. 深入理解Java虚拟机(九)——后端编译与优化

    即时编译器 Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运 ...

  4. 《深入理解java虚拟机》学习笔记之编译优化技术

    郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...

  5. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解

    郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...

  6. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  7. 《深入理解 java虚拟机》学习笔记

    java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.

  8. (1) 深入理解Java虚拟机到底是什么?

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机   作为一个Java程序员,我们每天都在写Java ...

  9. 深入理解java虚拟机【Java Class类文件结构】

    Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码 ...

随机推荐

  1. Hive实战UDF 外部依赖文件找不到的问题

    目录 关于外部依赖文件找不到的问题 为什么要使用外部依赖 为什么idea 里面可以运行上线之后不行 依赖文件直接打包在jar 包里面不香吗 学会独立思考并且解决问题 继承DbSearcher 读取文件 ...

  2. 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)

    目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...

  3. vue-cli3 vue2 保留 webpack 支持 vite 成功实践

    大家好! 文本是为了提升开发效率及体验实践诞生的. 项目背景: 脚手架:vue-cli3,具体为 "@vue/cli-service": "^3.4.1" 库: ...

  4. python 豆瓣top250

    豆瓣电影 import re import requests headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; ...

  5. django报错TypeError at /items/join(), no dict

    今天写Django模板的时候突然发现报了这个错误.stackflow了一下.改了一种dict的表达模式后成功解决. 错误: 报错写法: context = {'blogs': Blog.objects ...

  6. JAVA判断指定url地址是否匹配指定url集合中的任意一个

    判断字符串为空和判断集合是否为空用到依赖,也可以改成自己的方式 <!-- Spring Web --> <dependency> <groupId>org.spri ...

  7. JENKINS中创建全局变量并在JOB中使用

    配置了一个 "PASSWORD"的变量值 然后再脚本里面使用   注意这里必须要用双引号 不然不行

  8. java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal报错处理

    org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is ja ...

  9. UDP&串口调试助手用法(1)

    一览 UDP 串口 常用 功能概述 概览 支持UDP通信协议: 广播.单播.组播 支持串口通信 配置了常用的配置,常用的进制转化: 2进制,8进制,10进制,和16进制之间的转换 配置了 计算器,加减 ...

  10. 【LeetCode】253. Meeting Rooms II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+堆 日期 题目地址:https://leetco ...