题外话

最近在阅读《深入理解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. Nginx安全检查

    1.检查是否配置Nginx账号锁定策略 描述 1.执行系统命令passwd -S nginx来查看锁定状态 出现Password locked证明锁定成功 如:nginx LK ..... (Pass ...

  2. Python 计算AWS4签名,Header鉴权与URL鉴权

    AWS4 版本签名计算参考 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2021/7/24 8:12 # @Author:zhangm ...

  3. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

  4. mpstat 查看多核CPU负载状态

    mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查看所有 ...

  5. 好奇怪啊,如果邮箱JSON格式的字符串不是在一行上,那么转为JSON将转换不成功,估计是数据格式有问题吧

    好奇怪啊,如果邮箱JSON格式的字符串不是在一行上,那么转为JSON将转换不成功,估计是数据格式有问题吧, 打印出的数据必须是如下的在一行的字符串,才可以转换为JSON格式成功.

  6. JAVA使用反射获取对象的所有属性名

    public static void main(String[] args) { Field[] fields=BaseSalary.class.getDeclaredFields(); for (i ...

  7. Android 控件使用教程(三)—— NineGridImageView 九宫格展示图片

    引子 上文降到RecyclerView的使用,确实非常方便易用,而且样式多样,很灵活.但在图像展示时,经常有朋友圈和微博等9张图以内的图片展示需求,这时候,不是一个可以无限下滑的RecyclerVew ...

  8. BestCoder Round #66 (div.2)B GTW likes gt

    思路:一个O(n)O(n)的做法.我们发现b_1,b_2,...,b_xb​1​​,b​2​​,...,b​x​​都加11就相当于b_{x+1},b_{x+2},...,b_nb​x+1​​,b​x+ ...

  9. Anaconda下载与安装

    目录 Anaconda下载与安装 开发环境搭建介绍 Anaconda优势 Anaconda安装 测试安装成功 安装好Anaconda界面 如何启动jupyter 启动后新建文件 执行第一个程序 文件的 ...

  10. Elasticsearch核心技术(五):搜索API和搜索运行机制

    本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...