? 本次源码解析是以jdk1.8为基础的jvm源码,这里要简单介绍一下OpenJDK与Hotspot的关系:OpenJDK是JDK的开放原始码版本,而HotSpot只是OpenJDK中使用的虚拟机模块,也就是JVM,可以简单概括为OpenJDK > Hotspot,好了,有了这个前提,后面的事情就好理解了。
1、打开OpenJDK官网:https://openjdk.org/
2、找到左侧的Mercurial
,点击进入新界面
3、选择jdk8,点击进入新界面
4、整个源码结构,每个都要点击并下载,假设选择的是hotspot
5、点击zip下载
6、全部下载后,解压到同一个文件夹下
至此,源码已经下载完成,然后用Source Insight工具来打开源码,这里推荐这个工具,看源码非常方便,网上自行下载。考虑到Source Insight的搜索效率不高,建议再下载一个eclipse来辅助查看源码。
目录 | 描述 |
---|---|
corba | corba的实现 |
hotspot | hotspot虚拟机实现 |
jaxp | jaxp实现,处理xml的API |
jaxws | jax-ws实现,提供webservice的API |
jdk | java类库等的实现 |
langtools | 各种工具库 |
nashorn | javascript实现 |
cpu目录:该目录下包含一些依赖具体处理器架构的代码,目前主流的处理器架构主要有sparc、x86和zero,其中x86又最为常见,在涉及到相关源代码实现时,只讲x86目录下的源码实现。
os目录:该目录下包含一些依赖操作系统的代码,主要的操作系统有基于linux内核的操作系统、基于unix的操作系统(posix)、windows和solaris。这里主要以linux为基础,所以在涉及到相关源代码实现时,只会讲解linux目录下的源码实现。
os_cpu目录:该目录下包含一些依赖操作系统和处理器架构的代码,如linux_x86目录。linux_x86目录下包含的就是基于linux内核的操作系统和x86处理器架构相关的代码,也是本次系列文章要讲解的源代码实现。
share目录:该目录下包含了独立于操作系统和处理器架构的代码,尤其是vm子目录,HotSpot主要的一些功能模块都包含在这个子目录下。下表介绍了vm目录下一些重要子目录的功能。
目录 | 描述 |
---|---|
adlc | 平台描述文件 |
asm | 汇编器 |
c1 | C1编译器,即client编译器 |
ci | 动态编译器的公共服务/从动态编译器到VM的接口 |
classfile | Class文件解析和类的链接等 |
code | 机器码生成 |
compiler | 调用动态编译器的接口 |
gc_implementation | GC的具体实现 |
gc_interface | GC接口 |
interpreter | 解释器,包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用,因为太慢了,Jdk早期是用的这个) |
jfr | JVM 内置的基于事件的JDK监控记录框架 |
libadt | 抽象数据结构 |
memory | 内存管理 |
oops | JVM内部对象表示 |
opto | server编译器(又称“C2”或“Opto”) |
precompiled | 这个文件夹就一个precompiled.hpp文件,里面包括vm子目录中所有涉及的头文件,可以想像成java中的import导入头文件 |
prims | HotSpot VM的对外接口,包括部分标准库的native部分和JVMTI实现 |
runtime | 运行时支持库(包括线程管理、编译器调度、锁、反射等) |
services | 主要是用来支持JMX之类的管理功能的接口 |
shark | 基于LLVM的JIT编译器 |
utilities | 工具类库 |