极速体验编译openjdk8(docker环境)

简介: 在docker环境下,用最少的步骤把openjdk8源码编译构建成jdk

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos
  • 本文不讲解编译openjdk8的过程,而是专注于用最少的步骤把openjdk8源码编译构建成jdk。
  • 进行本文的实践有个前提:请读者们先在电脑上安装docker
  • 总的来说整个过程只有六步,如下:
  1. 指定镜像创建一个容器,这个镜像中已经把编译所需的工具和源码都准备好了;
  2. 进入容器;
  3. 找到openjdk8源码位置,有兴趣的读者此时可以修改源码;
  4. 在指定目录开始configure;
  5. configure完成后开始编译;
  6. 编译成功,进入build目录,检查验证全新的jdk;
  • 接下来开始实战吧:

指定镜像创建容器

  • 在控制台执行命令:
docker run --name=compilejdk -idt bolingcavalry/bolingcavalryopenjdk:0.0.1
  • 这个命令会先去hub.docker.com网站下载镜像bolingcavalry/bolingcavalryopenjdk:0.0.1,然后创建一个名字叫compilejdk的容器;

进入容器

  • 执行以下命令即可进入容器:
docker exec -it compilejdk /bin/bash

找到openjdk8源码位置,修改jdk源码

  • 和本次编译相关的资源都放在/usr/local/openjdk下面了,如下图:

这里写图片描述

  1. 我们这次要修改的文件是/usr/local/openjdk/hotspot/src/share/vm/runtime/objectMonitor.cpp;
  2. 执行命令vi /usr/local/openjdk/hotspot/src/share/vm/runtime/objectMonitor.cpp编辑这个文件;
  3. 找到方法ObjectMonitor::exit(bool not_suspended, TRAPS)
  4. 再找到该方法里面的int QMode = Knob_QMode ;这行代码;
  5. 在下面新增一行代码printf("-QMode : %d", QMode);,也就是将QMode的值在控制台打印出来,如下图:

这里写图片描述

  • 修改完毕后保存退出vi;
  • 新增这行代码的作用,是在每个synchronize{}代码块结束的时候,也就是线程释放锁的时候,在控制台将QMode这个参数的值打印出来;

在指定目录开始configure

  • 回到目录/usr/local/openjdk,执行以下命令进行configure:
./configure --with-debug-level=slowdebug
  • 执行完毕的效果如下图所示:

这里写图片描述

开始编译

  • 回到目录/usr/local/openjdk,执行以下命令开始编译:
make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CONF=linux-x86_64-normal-server-slowdebug
  • 编译耗时长短和机器硬件配置有关,我的2014版mac pro13大约用20分钟完成编译,执行完毕的效果如下图所示:

这里写图片描述

检查和验证全新的jdk

  • 进入目录/usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug,内容如下:

这里写图片描述

  • 图中的jdk文件夹中就是全新的jdk,进入这个文件夹再进入里面的bin目录,执行./java -version命令可以看到如下内容:

这里写图片描述

  • 如上图“1.8.0-internal-debug-_2017_08_30_13_00-b00“表示是最新构建的jdk版本,至于前面那几行“-QMode : 0“就是系统执行了释放锁的api,导致我们添加的那行代码被执行了;
  • 接下来我们写个java类在这个jdk上运行试试,在/usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin目录下,用vi命令创建Test.java文件,内容如下:
public class Test{
    public static void main(String[] args){
        Object lock = new Object();

        new Thread(()->{
            synchronized(lock){
                System.out.println("1. get lock success");
                System.out.println("1. release lock start");
            }

            System.out.println("1. release lock end");
        }).start();

        new Thread(()->{
            synchronized(lock){
                System.out.println("2. get lock success");
                System.out.println("2. release lock start");
            }

            System.out.println("2. release lock end");
        }).start();
    }
}
  • 代码很简单,就是执行了一次持有锁再释放锁的操作;
  • 还是在jdk/bin目录下,执行以下命令编译java文件,注意,一定要加上./,否则就不会使用最新的jdk:
./javac Test.java
  • 执行完javac命令之后,再执行./java Test就能把编译好的Test.class文件运行起来了,效果如下:

这里写图片描述

  • 如上图所示,在释放锁的时候会把我们添加的代码打印出来;
  • 以上就是在docker下最快速完成openjdk8编译的过程了,是不是很容易呢?如果您想了解更多细节,例如编译环境需要准备哪些材料,镜像如何制作,甚至如何用GDB给jvm打断点单步调试,请参考下面这两篇文章:
  1. 《在docker上编译openjdk8》
  2. 《修改,编译,GDB调试openjdk8源码(docker环境下)》

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关文章
|
16天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
29 1
|
1月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
27 2
|
1月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
38 5
|
1月前
|
jenkins Java 持续交付
Docker搭建jenkins环境
这篇文章详细介绍了如何利用Docker搭建Jenkins环境,包括拉取Jenkins镜像、配置端口映射及初始化设置的步骤。
136 0
Docker搭建jenkins环境
|
2月前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
415 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
2月前
|
虚拟化 Docker Windows
window 10专业版部署docker环境
本文介绍了如何在Windows 10专业版上部署Docker环境,包括安装步骤、配置镜像加速以及可能遇到的错误处理。
134 2
window 10专业版部署docker环境
|
1月前
|
Linux 持续交付 iOS开发
docker的使用(环境特殊时可以考虑使用)
docker的使用(环境特殊时可以考虑使用)
14 0
|
2月前
|
SQL 安全 数据库
Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南
Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南
339 1
|
2月前
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
69 0