OpenJDK 源码的目录结构

OpenJDK 源码的目录结构

转载声明:

本文系转载自以下文章:

转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,如果带来不便请联系我删除。

摘要

开启正文之前,先说一下源码剖析这一系列,就以“死磕到底”的精神贯彻始终,JDK–》JRE–》JVM(以openJDK代替)

最近想看看JDK8源码,但JDK中JVM(安装在本地C:\Program Files\Java\jdk1.8.0_121\jre\bin\server下jvm.dll)本身并不开源,只能找来openJDK来看(说是和JDK相似度很高)。源码包下载飞机票:http://download.java.net/openjdk/jdk8 (有时会坏,附上百度网盘https://pan.baidu.com/s/1o8bXbPC) 下载openjdk-8-src-b132-03_mar_2014.zip
下载完后发现目录结构很多,大体如下:

0x01 OpenJDK 源码的目录结构

openjdk

openjdk 
—— corba:不流行的多语言、分布式通讯接口 
—— hotspot:Java 虚拟机 
—— jaxp:XML 处理 
—— jaxws:一组 XML web services 的 Java API 
—— jdk:java 开发工具包 
—— —— 针对操作系统的部分 
—— —— share:与平台无关的实现 
—— langtools:Java 语言工具 
—— nashorn:JVM 上的 JavaScript 运行时

具体如下:

关键词说明

1.1 Corba

全称Common Object Request Broker Architecture,通用对象请求代理架构,是基于 对象-服务 机制设计得。与 JavaBean、COM 等是同种范畴。

目前,通用的远程过程调用协议是 SOAP(Simple Object Access Protocol,简单对象访问协议),消息格式是 XML-RPC(存在 Json-RPC)。
另外,Apache Thrift 提供了多语言 C/S 通讯支持;
不少语言也内置了跨语言调用或对分布式环境友好,比如:
lua 可以与 c 代码互调用,go 可以调用 C 代码,erlang 在本地操作与分布式环境下的操作方法一样等。

1.2 hotspot

全称 Java HotSpot Performance Engine,是 Java 虚拟机的一个实现,包含了服务器版和桌面应用程序版。利用 JIT 及自适应优化技术(自动查找性能热点并进行动态优化)来提高性能。

java -version 可以查看 Hotspot 的版本。

$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

从 Java 1.3 起为默认虚拟机,现由 Oracle 维护并发布。

其他 java 虚拟机:

  • JRockit:专注于服务器端,曾经号称是“世界上速度最快的 Java 虚拟机”,现归于 Oracle 旗下。
  • J9:IBM 设计的 Java 虚拟机。
  • Harmony:Apache 的顶级项目之一,从 2011 年 11 月 6 日起入驻 Apache 的 Java 项目。虽然其能够兼容 jdk,但由于 JCP (Java Community Process)仅仅允许授权给 Harmony 一个带有限制条件的TCK(Technology Compatibility Kit),即仅仅能使用在 J2SE ,而不是所有Java实现上(包括 J2ME 和 J2EE),导致了 Apache 组织与 Oracle 的决裂。Harmony 是 Android 虚拟机 Dalvik 的前身。
  • Dalvik 并不是 Java 虚拟机,它执行的是 dex 文件而不是 class 文件,使用的也是寄存器架构而不是栈架构 。

1.3 jaxp

全称 Java API for XML Processing,处理 XML 的Java API,是 Java XML 程序设计的应用程序接口之一,它提供解析和验证XML文档的能力。

jaxp 提供了处理 xml 文件的三种接口:

  • DOM 接口(文档对象模型解析),位于 \openjdk\jaxp\src\org\w3c\dom
  • SAX 接口(xml 简单 api 解析),位于 \openjdk\jaxp\src\org\xml\sax
  • StAX 接口(xml 流 api),位于 \openjdk\jaxp\src\javax\xml
  • 除了解析接口,JAXP还提供了XSLT接口用来对XML文档进行数据和结构的转换。

1.4 jaxws

全称 Java API for Web ServicesJAX-WS 允许开发者选择 RPC-oriented(面向 RPC) 或者 message-oriented(消息通信,erlang 使用的就是消息通信,不过 Java 内存模型是内存共享)来实现自己的web services

通过 Web Services 提供的环境,可以实现 Java 与其他编程语言的交互(事实上就是 thrift 所做的,任何一种语言都可以通过 Web Services 实现与其他语言的通信,客户端用一种语言,服务器端可以用其他语言)。

1.5 jangtools

Java 语言支持工具

1.6 jdk

全称 Java Development Kit,即java开发工具包。

1.6.1 share

share目录下classes目录里的是 Java 的实现,native目录里的是 C++ 的实现,两部分基本对应。这两个目录里的结构与 java 的包也是对应,各个部分的用途另外再讲。

back、instrument、javavm、npt、transport 几个部分是实现 java 的基础部分,都是 C++ 代码,在这里从最底层理解 java,往后这些内容也会详讲。

sampledemo 目录有以下示例,区别在于 demo 目录是 针对 appletsc 的。

1.7 Nashorn

Nashorn 项目的目的是基于 Java 在 JVM 上实现一个轻量级高性能的 JavaScript运行环境。基于 JSR-223 协议,Java 程序员可在 Java 程序中嵌入 JavaScript 代码。

该项目使用了 JSR-229 里描述的新连接机制(从 Java 7 起开始使用的连接机制):新的字节码(invokedynamic)以及新的基于方法句柄(method handle)的连接机制。通过接口注入(interface injection)在运行时修改类也是 JSR-229 里的内容。

0x02 Hotspot的目录结构

├─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                             单元测试

猜你喜欢

转载自blog.csdn.net/baichoufei90/article/details/85055655