HotSpot源代码
最近想看看JDK8源码,但JDK中JVM(安装在本地C:\Program Files\Java\jdk1.8.0_121\jre\bin\server下jvm.dll)本身并不开源,只能找来openJDK来看(说是和JDK相似度很高)。源码包下载飞机票:http://download.java.net/openjdk/jdk8
openjdk
—— corba:不流行的多语言、分布式通讯接口
—— hotspot:Java 虚拟机
—— jaxp:XML 处理
—— jaxws:一组 XML web services 的 [Java ](http://lib.csdn.net/base/java)API
—— jdk:java 开发工具包
—— —— 针对[操作系统](http://lib.csdn.net/base/operatingsystem)的部分
—— —— share:与平台无关的实现
—— langtools:Java 语言工具
—— nashorn:JVM 上的 [JavaScript](http://lib.csdn.net/base/javascript) 运行时
其中Hotspot就是我们要看的JVM包
Hotspot:全称 Java HotSpot Performance Engine,是 Java 虚拟机的一个实现,包含了服务器版和桌面应用程序版。利用 JIT 及自适应优化技术(自动查找性能热点并进行动态优化)来提高性能。
使用 java -version
可以查看 Hotspot 的版本。
HotSpot VM源码结构
HotSpot VM目录下主要由agent、make、src和test这4个子目录构成。
其中agent目录下包含了Serviceability Agent的客户端实现;
make目录下包含了用于编译HotSpot VM的各种配置文件;
src目录是最重要的一个目录,本书讲解的所有源代码都包含在这个目录下;
test目录下包含HotSpot相关的一些单元测试用例。
src目录下包含了HotSpot项目的主体源代码,主要由cpu、os、os_cpu与share这4个子目录构成。下面简单介绍一下这4个子目录,如下:
- cpu目录:此目录下包含一些依赖具体处理器架构的代码,现在主流的处理器架构主要有sparc、x86和zero,其中x86又最为常见,所以在涉及到相关源代码实现时,只会讲解x86目录下的源代码实现。
- os目录:此目录下包含一些依赖操作系统的代码,主要的操作系统有基于linux内核的操作系统、基于unix的操作系统(posix)、windows和solaris。在涉及到相关源代码实现时,只会讲解linux目录下的源代码实现。
- os_cpu目录:此目录下包含一些依赖操作系统和处理器架构的代码,如linux_x86目录。linux_x86目录下包含的就是基于linux内核的操作系统和x86处理器架构相关的代码,也是要讲解的源代码实现。
- share目录:此目录下包含了独立于操作系统和处理器架构的代码,尤其是vm子目录,这个子目录中包含的内容比较多,HotSpot主要的一些功能模块都包含在这个子目录下。下表介绍了vm目录下一些重要子目录的功能。
源码目录结构
目录 | 描述 |
---|---|
adlc | 平台描述文件 |
asm | 汇编器 |
c1 | C1编译器,即client编译器 |
ci | 动态编译器 |
classfile | Class文件解析和类的链接等 |
code | 机器码生成 |
compiler | 调用动态编译器的接口 |
Opto | C2编译器,即server编译器 |
gc_interface | GC接口 |
gc_implementation | 垃圾收集器的具体实现 |
interpreter | 解释器 |
libadt | 抽象数据结构 |
memory | 内存管理 |
oops | JVM内部对象表示 |
prims | HotSpot对外接口 |
runtime | 运行时 |
services | JMX接口 |
utilizes | 内部工具类和公共函数 |
JVM系列主要以HotSpot为主,按HotSpot各模块来一一展开,包括Class类文件成分,字节码文件加载及解析,HotSpot内存结构,JVM解析器,Kclass-Oop模型,垃圾回收器,执行引擎,字节码指令系统,JIT, AOT, 逃逸分析,栈顶缓存等等。
├─agent Serviceability Agent的客户端实现
├─make 用来build出HotSpot的各种配置文件
├─src HotSpot VM的源代码
│ ├─cpu CPU相关代码(汇编器、模板解释器、ad文件、部分runtime函数在这里实现)
│ ├─os 操作系相关代码
│ ├─os_cpu 操作系统+CPU的组合相关的代码
│ └─share 平台无关的共通代码
│ ├─tools 工具
│ │ ├─hsdis 反汇编插件
│ │ ├─IdealGraphVisualizer 将server编译器的中间代码可视化的工具
│ │ ├─launcher 启动程序“java”
│ │ ├─LogCompilation 将-XX:+LogCompilation输出的日志(hotspot.log)整理成更容易阅读的格式的工具
│ │ └─ProjectCreator 生成Visual Studio的project文件的工具
│ └─vm HotSpot VM的核心代码
│ ├─adlc 平台描述文件(上面的cpu或os_cpu里的*.ad文件)的编译器
│ ├─asm 汇编器接口
│ ├─c1 client编译器(又称“C1”)
│ ├─ci 动态编译器的公共服务/从动态编译器到VM的接口
│ ├─classfile 类文件的处理(包括类加载和系统符号表等)
│ ├─code 动态生成的代码的管理
│ ├─compiler 从VM调用动态编译器的接口
│ ├─gc_implementation GC的实现
│ │ ├─concurrentMarkSweep Concurrent Mark Sweep GC的实现
│ │ ├─g1 Garbage-First GC的实现(不使用老的分代式GC框架)
│ │ ├─parallelScavenge ParallelScavenge GC的实现(server VM默认,不使用老的分代式GC框架)
│ │ ├─parNew ParNew GC的实现
│ │ └─shared GC的共通实现
│ ├─gc_interface GC的接口
│ ├─interpreter 解释器,包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用)
│ ├─libadt 一些抽象数据结构
│ ├─memory 内存管理相关(老的分代式GC框架也在这里)
│ ├─oops HotSpot VM的对象系统的实现
│ ├─opto server编译器(又称“C2”或“Opto”)
│ ├─prims HotSpot VM的对外接口,包括部分标准库的native部分和JVMTI实现
│ ├─runtime 运行时支持库(包括线程管理、编译器调度、锁、反射等)
│ ├─services 主要是用来支持JMX之类的管理功能的接口
│ ├─shark 基于LLVM的JIT编译器(官方版里没有使用)
│ └─utilities 一些基本的工具类
└─test 单元测试
HotSpot的组成结构
JVM(全称Java Virtual Machine), 是一台虚拟的计算机,本身不跨平台。是Java,Python等编程语言生成的字节码文件的执行平台。具体的JVM可以由JRockit,HotSpot 等多种实现。但是需要遵循JVM规范,以实现语言的跨平台兼容性。最新的graalvm是一个多语言通用虚拟机。
HotSpot的组成包括:
- 类加载器子系统:负责加载二进制字节码文件流。
- 内存模型:Java栈,本地方法栈,Java堆,方法区,PC寄存器,直接内存
- 垃圾收集器:主要负责Java堆空间内存回收。
- 类文件解析器:解析二进制流字节码文件为对象模型
- 对象模型:虚拟机内部klass-Oop模型
- 解释器:虚拟机内部字节码执行单元,包括字节码解释器,模板解释器
- 编译器:虚拟机内置编译器,字节码指令的动态优化,包括JIT, AOT
- 监控: 虚拟机对外提供的运行时统计监控
- 运行时:虚拟机运行时环境
- 服务:虚拟机内部服务,包括内存,线程,运行时,类加载服务
- os模块:负责与具体的寄生系统交互