jvm原理1:cenos编译openjdk8

简介: 近期在研究jvm原理,看了不少书,总感觉停留在理论上,不能系统的学习以及深入理解。以及正所谓“纸上得来终觉浅,绝知此事要躬行”,要想深入的了解jvm原理,最起码要手动编译一个jdk以及虚拟机玩玩。

近期在研究jvm原理,看了不少书,总感觉停留在理论上,不能系统的学习以及深入理解。以及正所谓“纸上得来终觉浅,绝知此事要躬行”,要想深入的了解jvm原理,最起码要手动编译一个jdk以及虚拟机玩玩。本文总结一下自己在cenos6中编译openjdk8的一些粗浅经验,供大家参考学习。

1.操作系统说明

本文使用的cenos系统版本为cenos6.4 64位。可以使用如下的命令进行查看。

[root@localhost test]# uname -a
Linux localhost 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

2.编译

 2-1:获取源码

在本次的openjdk编译中,我们使用的版本为openjdk8.因此我们需要获取到openjdk8的源码。

openjdk8源码的获取方式有两种方式

1.使用hg工具进行源码的下载。

2.直接在官网进行下载源码包(下载地址)。

2-1-1 hg下载openjdk源码。

这种方式获取源码,比较耗时,下载的耗时时间,完全取决与我们的网速。在这里还是简单说明一下:

  首先,我们需要下载Mercurial。详细步骤如下:

 cd /var/local/    
 wget http://mercurial.selenic.com/release/mercurial-3.0.tar.gz    
 tar xvzf mercurial-3.0.tar.gz    
 mv mercurial-3.0 mercurial    
 cd mercurial    
 make all    
 make install  
上述的命令执行完毕之后,如果没有错误,则输入hg -v命令之后,控制台显示的信息如下:
分布式软件配置管理工具 - 水银
基本命令:
 add           add the specified files on the next commit
 annotate, blame
               show changeset information by line for each file
 clone         make a copy of an existing repository
 commit, ci    commit the specified files or all outstanding changes
 diff          diff repository (or selected files)
 export        dump the header and diffs for one or more changesets
 forget        forget the specified files on the next commit
 init          create a new repository in the given directory
 log, history  show revision history of entire repository or files
 merge         merge another revision into working directory
 pull          pull changes from the specified source
 push          push changes to the specified destination
 remove, rm    remove the specified files on the next commit
 serve         start stand-alone webserver
 status, st    show changed files in the working directory
 summary, sum  summarize working directory state

Mercurial安装完毕之后,我们就开始下载openjdk8的源码,命令如下:
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u
cd  jdk8u
bash get_source.sh
经过一段耐心时间的等待,源码就会下载完毕。如果网速不给力的小朋友,可以直接通过我提供的下载地址下载即可。

3、openjdk8源码安装

3.1 安装jdk必备软件包
安装jdk必备软件包如下所示:
yum makecache
yum -y groupinstall 'base'
yum groupinstall "Development Tools"  
yum install libXtst-devel libXt-devel libXrender-devel  
yum install cups-devel  
yum install freetype-devel  
yum install alsa-lib-devel  
大家可以一个个的下载安装即可。

3.2 环境准备

上述的一个个软件包安装完毕之后,我们来开始配置环境。首先我们看一下openjdk-jdk8u-jdk8u中的README-builds.htm文件,这个文件中详细说明了构建openjdk8的步骤以及方法,由于是英文版的,所以在这里我们暂时不一个个的说明了,用到的命令我们再来详细的说明。在构建环境之前,还是简单看一下这个文件,如下:
Some Headlines:
  • The build is now a "configure && make" style build
  • Any GNU make 3.81 or newer should work
  • The build should scale, i.e. more processors should cause the build to be done in less wall-clock time
  • Nested or recursive make invocations have been significantly reduced, as has the total fork/exec or spawning of sub processes during the build
  • Windows MKS usage is no longer supported
  • Windows Visual Studio vsvars*.bat and vcvars*.bat files are run automatically
  • Ant is no longer used when building the OpenJDK
  • Use of ALT_* environment variables for configuring the build is no longer supported
上面的一段话,大体意思就是openjdk8源码的构建可以直接使用 config && make方式。换言之,openjdk8之前的额源码构建需要使用Ant和ALT_ *。需要使用到的make版本为3.81以及以后的版本(包含)。

3.3 make版本检查

在控制台输入make -v命令,输出信息如下:
[root@localhost openjdk-jdk8u-jdk8u]# make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-redhat-linux-gnu

3.4 引导启动jdk设置

注意:在编译openjdk8的时候,我们需要安装一个引导启动的jdk,并且这个jdk必须是7版本。这一点需要注意,引导启动jdk的版本要比编译的jdk版本小1。比如我们在编译openjdk7,那么我们需要安装的引导启动jdk版本为6;我们在编译openjdk6,那么我们需要安装的引导启动jdk版本为5。
在这里我使用的引导启动jdk版本为
jdk1.7.0_80,目录为 /opt/jdk1.7.0_80。

4、开始编译openjdk8

上述的环境准备完毕之后,就开始我们的openjdk8编译了。首先我们进入/opt/openjdk-jdk8u-jdk8u目录,输入的命令如下:
cd openjdk  
bash ./configure --with-target-bits=64 --with-boot-jdk=/opt/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0  
make all ZIP_DEBUGINFO_FILES=0

参数说明:

 --with-boot-jdk:指定引导JDK所在目录,以防其他安装的JDK影响(本机上以前安装了JDK8,并配置了JAVA_HOME指向JDK8);

      --with-target-bits:指定编译64位系统的JDK;

        

为可以进行源码调试,再指定下面三个参数:

      --with-debug-level=slowdebug:指定可以生成最多的调试信息;

      --enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成调试的符号信息,并且不压缩;这个调试的时候非常有用。

命令最终执行完毕之后,即可完成编译,因为我实在虚拟机中进行openjdk8的编译,所以大概花费了2个小时。

5.测试编译的openjdk

编译的文件位于build/linux-x86_64-normal-server-slowdebug中,我们继续进入子目录,完整目录如下:

/opt/openjdk-jdk8u-jdk8u/build/linux-x86_64-normal-server-slowdebug/jdk/bin

输入java -version命令,效果如下所示:

[root@localhost bin]# java -version
java version "1.8.0_162-ea"
Java(TM) SE Runtime Environment (build 1.8.0_162-ea-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b01, mixed mode)

ok,当看到上面的命令成功执行之后,便说明我们的openjdk8手工编译成功了。






    

相关文章
|
2天前
|
Rust 安全 Java
JVM原理与实现——Synchronized关键字
在多线程Java程序中,`Synchronized`关键字用于确保线程安全。本文深入探讨其工作原理,通过分析字节码`monitorenter`和`monitorexit`,解释JVM如何实现同步机制。文章展示了`Synchronized`方法的编译结果,并详细解析了轻量锁和重度锁的实现过程,包括Mark Word的状态变化及CAS操作的应用。最后简要介绍了`ObjectMonitor::enter()`函数在获取重度锁时的作用。
JVM原理与实现——Synchronized关键字
|
2月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
60 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
5月前
|
存储 监控 Java
揭秘Java虚拟机:探索JVM的工作原理与性能优化
本文深入探讨了Java虚拟机(JVM)的核心机制,从类加载到垃圾回收,再到即时编译技术,揭示了这些复杂过程如何共同作用于Java程序的性能表现。通过分析现代JVM的内存管理策略和性能监控工具,文章提供了实用的调优建议,帮助开发者有效提升Java应用的性能。
82 3
|
5月前
|
存储 监控 安全
深入理解Java虚拟机(JVM)原理
深入理解Java虚拟机(JVM)原理
|
6月前
|
Java 编译器
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
65 1
|
5月前
|
Java 编译器 C++
Java演进问题之HotSpot JVM中的分层编译策略如何解决
Java演进问题之HotSpot JVM中的分层编译策略如何解决
|
5月前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
81 0
|
6月前
|
存储 监控 算法
深入理解Java虚拟机(JVM)原理与调优技巧
深入理解Java虚拟机(JVM)原理与调优技巧