深入理解Java虚拟机之自己编译JDK

题外话

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

前置准备

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

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

  • 下载安装解压即可

深入理解Java虚拟机之自己编译JDK

编译工具版本推荐:

  • 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命令会进行依赖项检查,参数配置和构建输出目录结构等操作,所以依赖缺失会得到明确提示:

深入理解Java虚拟机之自己编译JDK

ZIP安装命令:

sudo apt-get install zip

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

深入理解Java虚拟机之自己编译JDK

成功界面:

深入理解Java虚拟机之自己编译JDK

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

不出所料,编译报错:

深入理解Java虚拟机之自己编译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++

深入理解Java虚拟机之自己编译JDK

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

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

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

测试一波:

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

编译成功:

深入理解Java虚拟机之自己编译JDK

目录结构:

深入理解Java虚拟机之自己编译JDK

在IDE工具上调试

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

深入理解Java虚拟机之自己编译JDK

等待导入……

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

深入理解Java虚拟机之自己编译JDK

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

具体设置各项参数如图:

深入理解Java虚拟机之自己编译JDK

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

深入理解Java虚拟机之自己编译JDK

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

深入理解Java虚拟机之自己编译JDK

IDEA配合Clion远程调试

IDEA配置

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

深入理解Java虚拟机之自己编译JDK

Clion配置

  • 添加Configuration,选择Custom Build Configuration
  • Target 需要添加一下,
    深入理解Java虚拟机之自己编译JDK
    深入理解Java虚拟机之自己编译JDK
  • Executable依然选择编译出来的Java命令
  • Program arguments填写:
-jar
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008
xxx.jar
  • Working directory选择:上述jar包生成位置

最终配置如图:

深入理解Java虚拟机之自己编译JDK

参考资料

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

Original: https://www.cnblogs.com/Zhouge6/p/15781939.html
Author: 笔架山Code
Title: 深入理解Java虚拟机之自己编译JDK

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573640/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【SpringBoot】【2】多模块项目共享公共的配置文件

    前言: 项目有多个module的时候,其实很多参数都是一样的,每个module都配置的话很累赘而且不易于修改,所以可以将公共的东西独立出来。 正文: 1,创建独立的module,存…

    Java 2023年5月29日
    061
  • Java实现AES加密

    生成秘钥简单粗暴 这边AES秘钥默认为128位,获得无政策权限后可为192或256,因此对应字符为16位,直接生成16位的秘钥 import java.io.Unsupported…

    Java 2023年6月5日
    0114
  • java 多线程 ConcurrentArrayList

    java中的List类型中,只有CopyOnWriteArrayList是线程安全的ArrayList。 在copyOnWriteList中,基本底层还是不变:由数组构成的链表,有…

    Java 2023年5月29日
    086
  • 反射 构造函数 参数

    引用:http://xiaohuafyle.iteye.com/blog/1607258 通过反射创建新的类示例,有两种方式:Class.newInstance()Construc…

    Java 2023年5月30日
    075
  • 《拉钩课程 — 计算机网络通关》学习笔记

    一、概述 1、程序员基础知识大致可以分为七种基本科学:计算机组成原理、操作系统、计算机网络、算法和数据结构、图形学、编译原理、编辑技巧。 2、ISP:Internet Servic…

    Java 2023年6月7日
    076
  • Java学习 (10)Java流程控制篇(01)Scanner

    Java学习 (10)Java流程控制篇(01)Scanner Scanner对象 Scanner对象基本内容 关于next() 和 nextLine() 方式的区别 next()…

    Java 2023年6月8日
    085
  • java实现设置Excel下拉框

    在使用Excel的时候用到了下拉框,实现的效果如下↓ 在生成excel文件时,需要根据给出的下拉框选项列表动态生成下拉框。实现代码如下: private void createSe…

    Java 2023年6月5日
    0104
  • 线程不安全

    众所周知,多线程访问同一公共资源会带来线程的不安全,本文探讨一下这个问题的若干细节。 关于线程安全的基本问题 有关线程安全常涉及两个概念: 竞态条件:当两个线程竞争同一资源时,如果…

    Java 2023年5月30日
    068
  • java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;

    问题描述: 在idea 中启动项目代码 出现以下错误: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getC…

    Java 2023年5月29日
    095
  • 原云生实战

    注:1.此文档来自尚硅谷-雷丰阳老师–原云生实战笔记. 初始连接:https://www.yuque.com/leifengyang/oncloud/vfvmcd 1、…

    Java 2023年6月16日
    085
  • 关于ThreadLocal最直白的解释

    ThreadLocal 底层原理如下:实线是强引用,虚线是弱引用Thread 持有 ThreadLocal 对象的引用,ThreadLocalMap 是 Thread 的成员变量,…

    Java 2023年6月9日
    081
  • Lucene、solr以及elasticsearch之间的区别和联系

    微信搜索:小大白日志 Lucene、solr以及elasticsearch之间的区别和联系 lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引、以及进行搜索的代码,…

    Java 2023年6月8日
    084
  • 如何使用 RSA 加密 JWT

    <dependency> <groupid>com.nimbusds</groupid> <artifactid>nimbus-jo…

    Java 2023年6月7日
    097
  • 使用jhipster 加速java web开发

    jhipster,中文释义: Java 热爱者! JHipster is a development platform to quickly generate, develop, …

    Java 2023年5月29日
    082
  • 根据map的value进行排序

    1、将Map放入List中 List> entryList = new ArrayList(result Map.entrySet()); 2、利用Collections的s…

    Java 2023年6月5日
    089
  • springboot修改接口入参出参实现入参加密出参解密

    一、背景 针对项目已经开发完的接口,都需要加上传输数据加密的功能,对接口入参进行AES解密,对接口出参进行加密。考虑到尽量改动少点,使用自定义注解结合springmvc里的Requ…

    Java 2023年5月30日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球