JDK编译和运行

  • 系统环境
  • 编译JDK
    • 依赖安装
    • 下载源码
      • 打包下载(推荐)
      • clone下载
    • 编译
      • 构建文档
      • 运行配置
      • 构建
      • Hello, My JDK
  • CLion调试
    • 版本选择
    • 生成compile_commands.json
    • 编译
    • 配置Toolchains
    • 导入项目
    • 配置Custom Build Targets
    • 配置Run/Debug Configurations
    • 测试java -version
    • 测试普通java
  • 参考文章
    • 解决JDK编译过程问题
    • CLion配置

系统环境

  • 系统:macOS Big Sur 11.6.1
  • JDK IDE:CLion 2021.3.4
  • Java IDE:IntelliJ IDEA 2021.3.3 (Ultimate Edition)
  • Boot JDK:
    java version “11.0.13” 2021-10-19 LTS
    Java™ SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370)
    Java HotSpot™ 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode)
  • 编译 JDK:
    openjdk version “12-internal” 2019-03-19
    OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
    OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)

编译JDK

依赖安装

hg版本管理工具(如果打包下载jdk,可以不用安装此依赖):

brew install mercurial

编译器缓存:

brew install ccache

字体库:

brew install freetype

自动配置:

brew install autoconf

如果brew安装慢,可以问一下搜索引擎配置成阿里云的镜像,这里不在赘述。

下载源码

源码地址:https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f
有两种方式可以获取到源码,基于国内的网络安全策略,建议使用第一种方式。

打包下载(推荐)

直接点击zip或者gz,下载压缩包,然后解压到自己的目录内。

clone下载

hg clone https://hg.openjdk.java.net/jdk/jdk12

编译

构建文档

编译之前建议读一遍源码里的构建文档,介绍了基础的安装步骤和一些注意事项,以及一些常见错误的解决方案,使用chrome翻译成中文后,对照着原文档很容易理解。路径是在${prefix_path}/jdk12-06222165c35f/doc/building.html

${prefix_path} 填写本地的绝对路径,例如:/Users/root/jdk-build/jdk12-06222165c35f,后文都以此表示,不在赘述。

运行配置

编译FastDebug版、仅含Server模式的HotSpot虚拟机:
切换到下载的jdk文件夹下

cd jdk12-06222165c35f

然后执行一下命令:

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

如果编译通过,应该会得到如下信息:

Configuration summary:
* Debug level:    fastdebug
* HS debug level: fastdebug
* JVM variants:   server
* JVM features:   server: 'aot cds cmsgc compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs'
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 12-internal+0-adhoc.pengo.jdk12-06222165c35f (12-internal)Tools summary:
* Boot JDK:       java version "11.0.13" 2021-10-19 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home)
* Toolchain:      clang (clang/LLVM from Xcode 13.2.1)
* C Compiler:     Version 13.0.0 (at /usr/bin/clang)
* C++ Compiler:   Version 13.0.0 (at /usr/bin/clang++)Build performance summary:
* Cores to use:   8
* Memory limit:   16384 MB

构建

make images

在这个过程中你可能会遇到许多错误,可以参考此篇文章进行解决。传送门
编译完成后会输出如下信息:

Hello, My JDK

现在是测试一下你自己编译的JDK的时候了:

./build/macosx-x86_64-server-fastdebug/jdk/bin/java -version

正常会输出你编译的JDK版本号和配置的环境:

CLion调试

版本选择

书上选择的版本是CLion 2019.1,本人选择的版本是CLion 2021.3.4,2019版本可以问一下度娘,基本都有,现在只记录一下使用2021版本遇到的坑。

生成compile_commands.json

由于2021版本只有open选项,所以要在编译出来的JDK里生成compile_commands.json后再导入CLion中,https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/ Jetbrains中记录了这个问题,现在只说一下解决方法。

make CONF=macosx-x86_64-server-fastdebug compile-commands

macosx-x86_64-server-fastdebug是我本地的版本,可以替换成自己的,如果是第一次编译,建议设置成和楼主一样的,下文不再赘述。

之后在build/macosx-x86_64-server-fastdebug/compile_commands.json就可以看到此文件。

编译

再执行一遍编译:

make CONF=macosx-x86_64-server-fastdebug

配置Toolchains

CLion中Preferences | Build, Execution, Deployment | Toolchains中配置,我是取得默认的。

导入项目

File | Open选中生成的compile_commands.json,然后通过Tools | Compilation Database | Change Project Root把根目录设置为 jdk12-06222165c35f

配置Custom Build Targets

Preferences | Build, Execution, Deployment | Custom Build Targets,先Add一个target,然后再增加一个External Tools。
make External Tools 配置信息:

Program: make
Arguments: CONF=macosx-x86_64-server-fastdebug
Working directory: ${prefix_path}/jdk12-06222165c35f

clean External Tools 配置信息:

Program: make
Arguments: CONF=macosx-x86_64-server-fastdebug clean
Working directory: ${prefix_path}/jdk12-06222165c35f

给一个命名:macosx-x86_64-server-fastdebug,然后Build里填写make External Tools,Clean里填写clean External Tools

配置Run/Debug Configurations

点击Edit Configurations,然后新建一个Custom Build Application,给一个命名,然后填写如下的配置:

Target: macosx-x86_64-server-fastdebug
Executable: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/java
Program arguments: -version

然后删除掉Before launch里的Build

可能有许多教程里写的是新建CMake Application,但楼主在2021版本中新建后,是无法选择上一步配置的Target的,可以根据自己选择的CLion版本,新建CMake Application和Custom Build Application都试一下,看一看哪个能用。

测试java -version

然后Run刚刚配置的Config,不出意外意外你应该能得到如下信息:

openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)

如果是Debug启动的话,你可能会出现断点,F9跳过即可,然后打印出下面的信息:

Signal: SIGSEGV (signal SIGSEGV)
Signal: SIGSEGV (signal SIGSEGV)
Signal: SIGSEGV (signal SIGSEGV)
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)

有两种解决方案:

  • 在LLDB下执行以下命令
pro hand -p true -s false SIGSEGV SIGBUS
  • 或者在~/.lldbinit文件中,添加如下命令
breakpoint set --file /Users/naver/jvm/jdk12-06222165c35f/src/java.base/share/native/launcher/main.c --line 98 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true

不过楼主没有配置,各位可以根据情况自己配置。

测试普通java

在IDEA中新建一个项目,然后添加一个普通的类和main方法:

public class Main {public static void main(String[] args) {Thread t1 = new Thread(() -> {System.out.println("thread run");});System.out.println("Hello, My JDK.");t1.start();}
}

一定要在Source 目录下新建类,不然可能会报类找不到的异常:

错误: 找不到或无法加载主类 Main
原因: java.lang.NoClassDefFoundError: com/pengo/testdemo/testjdk/Main (wrong name: Main)

新建一个Custom Build Application,给一个命名,然后填写如下的配置:

Target: macosx-x86_64-server-fastdebug
Executable: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/java
Program arguments: Main
Working directory: /testdemo/src/main/java/

Working directory: 就是你IDEA项目的绝对路径。

Before launch里配置一个External Tool,目的是把刚刚编写的Main.java编译成Main.class。
填写上如下的配置:

Program: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/javac
Arguments: /testdemo/src/main/java/Main.java
Working directory: $ProjectFileDir$

如果一切正常,你会得到如下的信息:

Hello, My JDK.
thread run

跳转顶部

参考文章

解决JDK编译过程问题

https://blog.csdn.net/qq_33543634/article/details/121153063

CLion配置

https://www.jianshu.com/p/0fc877be4c3d
https://blog.csdn.net/IamnotLoveJava/article/details/118543659

跳转顶部

深入理解Java虚拟机(1)——JDK源码分析相关推荐

  1. 【JDK】JDK源码分析-HashMap(1)

    概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是"链表法",并且在 J ...

  2. 死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  3. 《深入理解Spark:核心思想与源码分析》——1.2节Spark初体验

    本节书摘来自华章社区<深入理解Spark:核心思想与源码分析>一书中的第1章,第1.2节Spark初体验,作者耿嘉安,更多章节内容可以访问云栖社区"华章社区"公众号查看 ...

  4. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  5. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  6. 【JDK】JDK源码分析-CountDownLatch

    概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行. 简单起见,可以把它理解为一个倒数的计数器:初始值为线程 ...

  7. 《深入理解Spark:核心思想与源码分析》——1.3节阅读环境准备

    本节书摘来自华章社区<深入理解Spark:核心思想与源码分析>一书中的第1章,第1.3节阅读环境准备,作者耿嘉安,更多章节内容可以访问云栖社区"华章社区"公众号查看 1 ...

  8. JDK源码分析(2)LinkedList

    JDK版本 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 ...

  9. StringBuffer类【JDK源码分析】

    StringBuffer类[JDK源码分析] 前言 推荐 说明 StringBuffer类 基本信息 属性 构造方法 部分方法 length capacity append insert revers ...

  10. 死磕Java集合之BitSet源码分析(JDK18)

    死磕Java集合之BitSet源码分析(JDK18) 文章目录 死磕Java集合之BitSet源码分析(JDK18) 简介 继承体系 存储结构 源码解析 属性 构造方法 set(int bitInde ...

最新文章

  1. Python:一行代码将以e为结尾的科学计算法类型的数值转为小数点类型数值
  2. zz让你成功的九个心理定律
  3. java mybits架构图_java架构之路-(mybatis源码)mybatis执行流程源码解析
  4. PreparedStatement跟Statement的对比
  5. 一个核物理学霸为何两次收到BlackHat的邀请
  6. REST服务和RESTful API是什么
  7. 第13课:JSP动作 Indude动作和指令的区别(JSP教程 JSP入门实战教程 黄菊华Java网站开发系列教程)
  8. NB-IOT紧急按钮
  9. PHP二次元风格发卡系统源码荔枝发卡网
  10. WEBVTT字幕格式转SRT
  11. 蓝桥杯 Python 练习题 数列排序
  12. 阿里内部使用的12 款开发工具,很多人可能都没听过
  13. python 扯线木偶_年轻的50个细节
  14. 流媒体协议(一):HLS 协议
  15. 获取get请求中的参数
  16. dos命令进入文件夹
  17. 设置input[type=number]不显示箭头
  18. 基于SSM实现的健身房俱乐部管理系统-JAVA【数据库设计、论文、源码、开题报告】
  19. 读书笔记——《岛上书店》
  20. python中readlines是什么意思_Python中read,readline,readlines三种方式的区别

热门文章

  1. IE缓存文件提取器 视频,音频,图片一网打尽
  2. virtuebox 安装VBoxGuestAdditions,ubuntu下设置文件共享
  3. linux下vivado编译卡死,vivado+zedboard之Linux编译
  4. excel数据库_从案例说excel如何实现数据库管理
  5. PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择
  6. HNU信息院大二夏季实训——利用单片机制作游戏
  7. m.555lu.co list.php,CST 仿真色散曲线
  8. 溯源:通过qq电话获取对方位置
  9. Monkey Test - 命令
  10. 三大框架SSM基础知识点