极速体验编译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环境下)》

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

学习路上,你不孤单,欣宸原创一路相伴...
相关文章
|
2月前
|
弹性计算 运维 Linux
Docker环境如何配置?使用阿里云OOS一步搞定!
阿里云OOS简化了ECS上应用部署,提供Docker一键安装服务。支持多种操作系统,包括Alibaba Cloud Linux、CentOS、Ubuntu、Debian和Windows Server。要安装Docker,用户只需在OOS扩展程序中选择并确认实例,执行安装。OOS扩展程序还支持Java、Python等开发环境及宝塔面板、WordPress等应用的快速配置,提升运维效率,让云资源管理更便捷。
53476 3
Docker环境如何配置?使用阿里云OOS一步搞定!
|
5天前
|
敏捷开发 API 持续交付
阿里云云效产品使用问题之流水线编译docker时,如何把已经定义好的token传入编译参数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用问题之流水线编译docker时,如何把已经定义好的token传入编译参数
|
16天前
|
Docker 容器
蓝易云 - docker之Consul环境的部署
注意,这只是一个基本的Consul环境的部署。在生产环境中,你可能需要配置更多的选项,如数据持久化、网络设置等。
13 1
|
19天前
|
Docker 容器
蓝易云 - docker环境安装软件、更换镜像源以及E: Unable to locate package xxx解决
"E: Unable to locate package xxx"这个错误通常意味着APT包管理器无法找到你想要安装的软件包。可能的原因包括:软件包名称错误,软件包不存在,或者软件源没有更新。可以尝试更新软件源(`apt-get update`),确保软件包名称正确,或者更换软件源解决这个问题。
152 1
|
21天前
|
机器人 开发工具 计算机视觉
基于 docker 环境的 LET-VINS 复现
该文介绍了在Docker环境下实践LET-NET的步骤。从GitHub克隆LET-NET代码,使用Docker运行vins-mono环境。安装ncnn,配置代理,更新源,安装依赖并验证安装成功。在运行LET-NET时遇到opencv版本不兼容,指出怎么安装指定版本的 opencv。解决Docker容器中的显示问题,通过`xhost +`命令运行LET-NET。在ROS中构建VINS-Mono时,cv_bridge找不到的问题,通过安装cv_bridge,设置ROS环境和工作空间,以及解决ncnn的配置问题,最终成功运行VINS-Mono。还需要下载UMA-VI数据集并修改相关路径以运行演示。
|
24天前
|
机器学习/深度学习 安全 测试技术
【Docker项目实战】在Docker环境下使用RustScan端口扫描工具
【6月更文挑战第9天】在Docker环境下使用RustScan端口扫描工具
31 5
|
26天前
|
NoSQL Ubuntu 关系型数据库
轻松上手 Docker:一键部署常用软件环境指南
轻松上手 Docker:一键部署常用软件环境指南
165 0
|
8天前
|
网络协议 安全 Docker
windows环境下的设置docker远程访问(开放2375端口)
windows环境下的设置docker远程访问(开放2375端口)
14 0
|
2月前
|
jenkins 持续交付 开发工具
蓝易云 - 基于Jenkins自动打包并部署docker环境
以上就是基于Jenkins自动打包并部署docker环境的基本步骤。在实际操作中,你可能需要根据你的具体需求进行一些调整。
134 0
|
2月前
|
监控 安全 云计算
云端防御战线:云计算环境下的网络安全策略构建高效稳定的Docker容器监控体系
【5月更文挑战第27天】 在数字化时代的浪潮中,云计算已成为企业与个人存储和处理数据的重要平台。然而,随着云服务使用率的飙升,网络威胁也愈发狡猾且复杂。本文将深入探讨在云计算环境中维护网络安全的挑战及策略,重点分析信息安全的关键组成部分,并提出多层次防御模型以增强云环境的数据保护能力。通过剖析最新的安全技术与实践,我们旨在为读者提供一套全面的网络安全解决方案蓝图。