专栏首页实战docker极速体验编译openjdk8(docker环境)

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

本文不讲解编译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打断点单步调试,请参考下面这两篇文章:

在docker上编译openjdk8

修改,编译,GDB调试openjdk8源码(docker环境下)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【腾讯云的1001种玩法】Docker 部署dotnetcore

    大家一起来学习docker, dotnetcore。Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本...

    屈政斌
  • Docker 使用指南 (五)—— Dockerfile 详解

    制作Docker image 有两种方式:一是使用 Docker container,直接构建容器,再导出成 image 使用;二是使用 Dockerfile,...

    田飞雨
  • 5 种 Docker 日志最佳实践

    微服务和容器很好地结合了,但是它们的结合让日志记录也变成了一个难题。作者在本文描述了一些因素,在设置监控的时候是需要考虑的。

    胡文翠
  • 大规模排行榜系统实践及挑战

    在过去的一年中,排行榜系统从无到有,接入的业务从单一的QQ会员到企鹅电竞动漫等20几个各类业务,接入的排行榜数实现了从几个到数万的突破,单个排行榜用户数最大90...

    小时光
  • Docker 使用指南 (四)—— 数据卷的使用

    有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据。数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 U...

    田飞雨
  • Docker 使用指南 (一)—— 基本操作

    Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便...

    田飞雨
  • Docker 使用指南 (二):搭建本地仓库

    去中央仓库下载镜像有时候非常的慢,所以 docker 本地仓库和 gitlab 类似,都是为了便于公司内部人员的使用。

    田飞雨
  • Docker 使用指南 (三)—— 网络配置

    本文详细介绍了Docker网络配置的四个模式,以及模式下的具体配置操作。希望对入门,Docker的童鞋有所帮助。

    田飞雨
  • Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈

    Docker 部署 Django 应用可以通过两种方式来完成:迭代构建和容器互联。以下记录使用容器互联的方式搭建 Django 容器栈的过程。

    田飞雨
  • 在腾讯云服务器上体验 Docker

    在腾讯云的 ubuntu 服务器上安装和运行 Docker,Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。

    姚俊刚

扫码关注云+社区

领取腾讯云代金券