Hotspot源码结构

2016/01/20 JVM

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模块:负责与具体的寄生系统交互

Search

    微信好友

    博士的沙漏

    Table of Contents