openjdk源码阅读导航

转自:http://rednaxelafx.iteye.com/blog/1549577

这是链接帖。主体内容都在各链接中。 
怕放草稿箱里过会儿又坑掉了,总之先发出来再说…回头再慢慢补充内容。 
先把ItEye网站上的信息聚合起来。

近期提问帖: 
阅读openjdk源代码 
如何来看OpenJDK源码 
如何分析OpenJDK中JVM的实现 
一个个回复太麻烦了,合在一块儿写这么一篇。

================

前言

我的VM帖的索引

高级语言虚拟机(HLLVM)群组

新浪微群“JVM源码阅读活动

如何构建javac的调试环境 
为什么有时候调试代码的时候看不到变量的值 
自己编译JDK的src.zip的步骤 
Ubuntu下编译openjdk成为可调试版 
有人在Centos5 下build jdk1.6 成功吗?

ItEye论坛讨论帖: 
Java IDE 添加 JDK 源代码关联 
JDK(32bit)的高级安装——Client模式与Server模式

===========================

OpenJDK概况

http://openjdk.java.net

OpenJDK历史

曾任OpenJDK 6项目发布经理一职的Joe DarcyOSCON 2011上讲解了JDK与OpenJDK的历史与现状。下面引用他的演示稿中的几幅图。

OpenJDK的历史与版本系谱:

Joe Darcy 写道

Joe在他更早的一篇博文里详细描述过OpenJDK(特别是OpenJDK 6)的系谱。同一段文字也发布在OpenJDK的JDK 6项目主页面

Red Hat的Deepak Bhole则从项目的开源性角度写了另一篇讲述OpenJDK项目历史的博文。

Deepak Bhole 写道

综合上述资料及其它来源的一些信息可知:

Sun JDK有“发布列车”(release train)的概念。例如说,在JDK 6还在早期开发阶段,连首个版本都尚未发布时,JDK 6就是最新的开发分支,而同时也存在着JDK 1.4.2 update和JDK 5 update两个老版本的维护分支。开发通常是在最新分支上进行的;当功能或修复在最新分支上稳定下来之后,会backport到老版本的维护分支。

...  |  JDK 1.4.2 update -> ...
 v
JDK 5
 | |  JDK 5 update -> ...
 v
JDK 6
 | |  JDK 6 update -> ...
 v
...

类似这样。当Sun决定将JDK开源出来时,JDK 6与JDK 6 update 1都已经正式发布,而JDK 6 update维护分支已经从最新开发分支分离出来一段时间了;此时最新的开发分支是JDK 7。所以很自然的,OpenJDK以JDK 7为基础演化而来。

开源Java社区欢迎OpenJDK的工作,但JDK 7尚在早期开发阶段,不适合实际部署。在社区需求的驱动下,OpenJDK创建了JDK 6的对应版本——OpenJDK 6项目。但这份代码并不是从JDK 6 update分支开源而来,而是以OpenJDK 7 build 20为基础,将一些不适合放在JDK 6的代码去掉之后再打上JDK 6 update分支累积的一些代码更新而来。然后JDK 6 update、(Open)JDK 7、OpenJDK 6三个分支就分开发展了。这就是上面的系谱图所展现的情况。

在Oracle完成对Sun的收购后,OpenJDK的开发模型基本维持跟原本Sun时代一致;只在非常最近才开始有新的变化。在JDK 7正式发布、JDK 7 update项目建立后,JDK 8就成为了现在的最新开发分支。

现状是,Oracle主要也是在OpenJDK上进行主要的功能开发,这部分是以GPLv2 + Classpath Exception许可证完全开源的。同时Oracle也在开发一些商用的、闭源的功能,例如Java Flight Recorder。将这些闭源功能叠加在开源的OpenJDK上打包起来,就是产品版的Oracle JDK 7 / 7 update / 8。

OpenJDK与Oracle JDK

大家都会对这个问题感兴趣:OpenJDK与Oracle JDK到底有多像? 
说真的我也不知道准确答案。从外部看:

  • JDK 6的源码从最早的JDK 6到JDK 6 update 23都有以JRL许可证发布。但上面的系谱已经说明了,Oracle/Sun JDK 6的源码跟OpenJDK 6的源码由于来源路径的不同,本来就会存在一定的差异,所以并不适合直接用于比较。
  • Oracle JDK 7的源码没有像JDK 6那样以JRL许可证发布,外界无法比较它与OpenJDK 7的准确差异。JDK 7 update、JDK 8都是同理。

这种情况下,还是让我们相信Joe Darcy的说法吧。继续引用他在OSCON 2011上的演示稿里的图:

Joe Darcy 写道

JDK、OpenJDK与HotSpot VM的版本

Oracle/Sun JDK、OpenJDK与HotSpot VM的版本对应关系

OpenJDK的其它发行版

IcedTea

UltraViolet™ Virtual Machine Development Kit

--------------------------

OpenJDK源码结构

主项目 
引用自OpenJDK 8的README

引用

The source code for the OpenJDK is delivered in a set of directories: hotspot, langtools, corba, jaxws, jaxp, and jdk.

The hotspot directory contains the source code and make files for building the OpenJDK Hotspot Virtual Machine. 
The langtools directory contains the source code and make files for building the OpenJDK javac and language tools. 
The corba directory contains the source code and make files for building the OpenJDK Corba files. 
The jaxws directory contains the source code and make files for building the OpenJDK JAXWS files. 
The jaxp directory contains the source code and make files for building the OpenJDK JAXP files. 
The jdk directory contains the source code and make files for building the OpenJDK runtime libraries and misc files.

The top level Makefile is used to build the entire OpenJDK.

----------------------------

编译OpenJDK

如何通过Mercurial下载OpenJDK的源码

经验帖: 
在XUbuntu 10.10上以JRL源码构建Oracle JDK 6 update 23 
Oracle已经决定不再以JRL许可证发布JDK 6的源码,所以上面这篇经验帖的许多内容变得没用了。不过这帖里也有写了OpenJDK的build方法,其实很简单的(取决于在什么平台上…)。

周志明(IcyFenix)写的《深入理解Java虚拟机》一书的第一章,1.5小节介绍了在Windows上build出OpenJDK 7的步骤,也值得入门者参考。

淘宝的同事大仁的经验帖:Ubuntu10.04下build OpenJDK7 的过程 
哪位大大编译过OpenJDK6,请教些问题

最新的OpenJDK 8里有新的build infrastructure,编译过程可能会有些变化。

===========

真的要读JVM的源码么?

第0次JVM源码阅读活动讨论了“是不是真的要读JVM源码,要读的话读什么,相关的推荐阅读”的话题。 
具体内容请参考活动的演示稿:为啥别读HotSpot VM的源码

特别推荐Maxine VM项目。

最新的一篇综述报告讲解了Maxine VM的目标、高层架构、性能水平等。

引用

A highly productive platform accelerates the production of research results. The design of a virtual machine (VM) written in the Java programming language can be simplified through exploitation of interfaces, type and memory safety, automated memory management (garbage collection), exception handling, and 
reflection. Moreover, modern Java IDEs offer time-saving features such as refactoring, auto-completion, and code navigation. Finally, Java annotations enable compiler extensions for low-level "systems programming" while retaining IDE compatibility. These techniques collectively make complex system software more "approachable" than has been typical in the past.

The Maxine VM, a meta-circular Java VM implementation, has aggressively used these features since its inception. A co-designed companion tool, the Maxine Inspector, offers integrated debugging and visualization of all aspects of the VM‘s run-time state. The Inspector‘s implementation exploits advanced Java 
language features, embodies intimate knowledge of the VM‘s design, and even reuses a significant amount of VM code directly. These characteristics make Maxine a highly approachable VM research platform and a productive basis for research and teaching.

Maxine VM的其它相关文献也都很值得一读 
https://wikis.oracle.com/display/MaxineVM/Publications

===========

阅读HotSpot VM的源码

HotSpot VM的源码结构

简记java launcher与HotSpot VM对VM参数的处理

请教一个share/vm/oops下的代码做fast subtype check的问题

HotSpot中这么多的Mutex Locker知多少

[请教]hotspot的模板解释方法时如何将方法的指令串起来

修改java.lang.String类时出错?

查看HotSpot VM动态生成的机器码

HotSpot没实现Megamorphic inline caching?

关于OpenJDK1.7的javac源码中JavaCompiler类的一点疑问

请教ad文件的格式

===========

结合论文来阅读源码

必读资料 
HotSpot Internals for OpenJDK 
(该wiki迁移到了OpenJDK官网上。老的https://wikis.oracle.com/display/HotSpotInternals/Home已经改为只读模式)

===========

邮件列表

OpenJDK官网左边栏上面的Mailing Lists

时间: 2024-10-25 10:12:36

openjdk源码阅读导航的相关文章

转-OpenJDK源码阅读导航跟编译

OpenJDK源码阅读导航 OpenJDK源码阅读导航 博客分类: Virtual Machine HotSpot VM Java OpenJDK openjdk 这是链接帖.主体内容都在各链接中. 怕放草稿箱里过会儿又坑掉了,总之先发出来再说…回头再慢慢补充内容. 先把ItEye网站上的信息聚合起来. 近期提问帖: 阅读openjdk源代码 如何来看OpenJDK源码 如何分析OpenJDK中JVM的实现 一个个回复太麻烦了,合在一块儿写这么一篇. ================ 前言 我的

OpenJDK 源码阅读之 Java 字节流输入类的实现

Java 的输入输出总是给人一种很混乱的感觉,要想把这个问题搞清楚,必须对各种与输入输出相关的类之间的关系有所了解.只有你了解了他们之间的关系,知道设计这个类的目的是什么,才能更从容的使用他们. 我们先对 Java I/O 的总体结构进行一个总结,再通过分析源代码,给出把每个类的关键功能是如何实现的. Java I/O 的主要结构 Java 的输入输出,主要分为以下几个部分: 字节流 字符流 Socket 新 I/O 每个部分,都包含了输入和输出两部分. 实现概要 这里只给出每个类的实现概要,具

OpenJDK 源码阅读之 TimSort

概要 这个类在 Oracle 的官方文档里是查不到的,但是确实在 OpenJDK 的源代码里出现了,Arrays 中的 sort 函数用到了这个用于排序的类.它将归并排序(merge sort) 与插入排序(insertion sort) 结合,并进行了一些优化.对于已经部分排序的数组,时间复杂度远低于 O(n log(n)),最好可达 O(n),对于随机排序的数组,时间复杂度为 O(nlog(n)),平均时间复杂度 O(nlog(n)).强烈建议在看此文前观看 Youtube 上的 可视化Ti

OpenJDK 源码阅读之 Arrays

概要 类继承关系 java.lang.Object java.util.Arrays 定义 public class Arrays extends Object 要点 此类主要是提供了一些操作数组的方法,比如排序啊,搜索啊.也提供一个工厂,用于将数组当成一个 List. 实现 quick sort public static void sort(int[] a) { DualPivotQuicksort.sort(a); } sort 使用了 util 中的另一个类中的方法,DualPivotQ

OpenJDK 源码阅读之 LinkedList

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.AbstractSequentialList<E> java.util.LinkedList<E> 定义 public class LinkedList<E> extends AbstractSequentialList<E> implements

OpenJDK 源码阅读之 ArrayDeque

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.ArrayDeque<E> 定义 public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable 要点 对 Deque 接口的实现 可调整大小 非线程安全 作为栈比 Stac

OpenJDK 源码阅读之 ArrayList

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.ArrayList<E> 定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serial

OpenJDK 源码阅读之 Java 字节流输出类的实现

Java 的输入输出总是给人一种很混乱的感觉,要想把这个问题搞清楚,必须对各种与输入输出相关的类之间的关系有所了解.只有你了解了他们之间的关系,知道设计这个类的目的是什么,才能更从容的使用他们. 这是这个系列的第二篇,描述字节输出类的实现,第一篇见:OpenJDK 源码阅读之 Java 字节流输入类的实现 字节流输出 图1 Java 字节输出类 OutputStream OutputStream是所有字节输出类的超类,这是个抽象类,需要实现其中定义的 write 函数,才能有实用的功能. pub

java8 ArrayList源码阅读

转载自 java8 ArrayList源码阅读 本文基于jdk1.8 JavaCollection库中有三类:List,Queue,Set 其中List,有三个子实现类:ArrayList,Vector,LinkedList http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/ArrayList.java 实现原理 transient Object[] elementData; // 存放元素