HotSpot和OpenJDK入门

本文介绍如何开始使用HotSpot Java虚拟机及其实现细节,涵盖HotSpot源码介绍、OpenJDK源码获取及构建流程,并探讨HotSpot运行时环境的基本构成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在本文中,我们将会介绍如何开始使用HotSpot Java虚拟机以及它在OpenJDK开源项目中的实现——我们将会从两个方面进行介绍,分别是虚拟机和虚拟机与Java类库的交互。

\

HotSpot源码介绍

\

首先让我们看看JDK源码和它所包含的相关Java概念的实现。检查源码的方式主要有两种:

\
  • 现代IDE能够附加src.zip(在$JAVA_HOME目录),能够从IDE中访问\
  • 使用OpenJDK的源码并导航到文件系统\

这两种方式都非常有用,但是重要的是哪种方式比较舒适一点。OpenJDK的源码存储在Mercurial(一个分布式的版本控制系统,与流行的Git版本控制系统相似)中。如果你不熟悉Mercurial,可以查看这本名为“版本控制示例”的免费书,该书介绍了相关的基础内容。

\

为了检出OpenJDK 7的源码,你需要安装Mercurial命令行工具,然后执行以下命令:

\
\hg clone http://hg.openjdk.java.net/jdk7/jdk7 jdk7_tl
\

该命令会在本地生成一个OpenJDK仓库的副本。该仓库含有项目的基础布局,但是并没有包含所有的文件——因为OpenJDK项目分别分布在几个子仓库中。

\

完成克隆之后,本地仓库应该有类似于下面的内容:

\
\ariel-2:jdk7_tl boxcat$ ls -l\total 664\-rw-r--r--  1 boxcat staff   1503 14 May 12:54 ASSEMBLY_EXCEPTION\-rw-r--r--  1 boxcat staff  19263 14 May 12:54 LICENSE\-rw-r--r--  1 boxcat staff  16341 14 May 12:54 Makefile\-rw-r--r--  1 boxcat staff   1808 14 May 12:54 README\-rw-r--r--  1 boxcat staff 110836 14 May 12:54 README-builds.html\-rw-r--r--  1 boxcat staff 172135 14 May 12:54 THIRD_PARTY_README\drwxr-xr-x 12 boxcat staff    408 14 May 12:54 corba\-rwxr-xr-x  1 boxcat staff   1367 14 May 12:54 get_source.sh\drwxr-xr-x 14 boxcat staff    476 14 May 12:55 hotspot\drwxr-xr-x 19 boxcat staff    646 14 May 12:54 jaxp\drwxr-xr-x 19 boxcat staff    646 14 May 12:55 jaxws\drwxr-xr-x 13 boxcat staff    442 16 May 16:01 jdk\drwxr-xr-x 13 boxcat staff    442 14 May 12:55 langtools\drwxr-xr-x 18 boxcat staff    612 14 May 12:54 make\drwxr-xr-x  3boxcat staff    102 14 May 12:54 test\
\

接下来,你应该运行get_source.sh脚本,该脚本是初始克隆内容的一部分。该脚本会填充项目的剩余部分,克隆构建OpenJDK所需要的所有文件。

\

在我们深入并详细地介绍源码之前,我们必须要有“不惧怕平台源码”的信念。开发者通常会认为JDK源码一定是令人振奋且难以接近的,但这毕竟是整个平台的核心。

\

JDK源码是固定的、经过良好的审核和测试的,但是并不是那么无法接近。特别是这些源码并不是始终包含Java语言的最新特性。所以我们经常会在其内部找到那些依然没有泛型化的、使用原始类型的类。

\

对于JDK源码而言,有几个主要的仓库是你应该熟悉的:

\

jdk

\

这是类库存在的地方。几乎所有的内容都是Java(本地方法会使用一些C代码)。这是深入学习OpenJDK源码的一个非常好的起点。JDK的类在jdk/src/share/classes目录中。

\

hotspot

\

HotSpot虚拟机——这里面是C/C++和汇编代码(还有一些基于Java的虚拟机开发工具)。这些内容非常高级,如果你并不是一个专业的C/C++开发人员那么这些内容会让人有一点难以入手。稍后我们会更加详细地讨论一些入门的好方法。

\

langtools

\

对于那些对编译器和工具开发感兴趣的人而言,可以从这里找到语言和平台工具。大部分是Java和C代码——学习这些内容比学习JDK代码要难,但是对于大多数开发者而言还是可以接受的。

\

还有一些其他的仓库,但是它们可能没有那么重要或者对大多数开发者而言没什么吸引力,这些仓库包括corba、jaxp和jaxws等内容。

\

构建OpenJDK

\

Oracle最近开始了一个项目对OpenJDK做了一次全面的修整,并且简化了构建过程。这个项目称为“build-dev”,目前该项目已经完成并且成为了构建OpenJDK的标准方式。对于很多使用基于Unix系统的用户而言,构建过程现在就和安装一个编译器和一个“引导JDK”然后运行三个命令那么简单:

\
\./configure\make clean\make images\
\

如果你想获取更多与构建自己的OpenSDK相关的信息,那么AdoptOpenJDK计划(由伦敦的Java社团创建)是一个不错的起点——这是一个由100多位草根开发者组成的社团,他们都工作在警告清理、小bug解决和OpenJDK 8对主要开源项目的兼容性测试等项目上。

\

理解HotSpot运行时环境

\

Java运行时环境正如OpenJDK所提供的那样,由HotSpot JVM和类库(大部分都捆绑到了rt.jar里面)组成。

\

因为Java是一个可移植的环境,所有需要调用操作系统的内容最终都会由一个本地方法处理。另外,还有一些方法需要JVM的特殊处理(例如类的加载)。这些内容也会通过一个本地调用移交给JVM。

\

例如,让我们看看原始Object类中本地方法的C代码。Object类的本地源码包含在jdk/src/share/native/java/lang/Object.c文件中,它有六个方法。

\

Java本地接口(JNI)通常会要求本地方法的C实现按照一种非常特别的方式命名。例如,本地方法Object::getClass()使用通用的命名约定,因此C实现被包含在一个具有如下签名的C函数中:

\

Java_java_lang_Object_getClass(JNIEnv *env, jobject this)

\

JNI还有另一种加载本地方法的方式,java.lang.Object类中剩余的5个本地方法就使用了这种方式:

\
\static JNINativeMethod methods[] = {\     {\"hashCode\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值