Read the fucking source code
记录阅读源码的心得体会。
OpenJDK-11源码,可供阅读学习使用。
src目录存放OpenJDK-11源码。阅读过程中写的注释直接写在源码文件中。test目录存放源码阅读过程中写的一些测试文件,使用时可将相关文件复制到新项目中。
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
-
该源码主要包括
src.zip里提供的源码,不支持直接编译。如想完整编译整个
OpenJDK项目,请自行到OpenJDK项目官网下载链接库和编译工具。 -
此源码与
Oracle JDK源码并非完全一致。Oracle JDK仅开源了一部分代码。想深入学习JDK的话建议阅读此源码。 -
源码原本采用了
JDK 9之后的module模块系统组织,此处修改为熟悉的包组织形式,以便阅读。(根本原因是我以module的形式导入IDEA后有些module识别不来) -
因为本源码已经包含了
OpenJDK中绝大多数公开的源码,所以不建议再为此项目重复关联JDK,因为这会造成在代码跳转中,跳转到关联JDK的源码中而不是直接跳转到本项目的源码中。此外,本项目还有一些源码是JDK里不提供的,所以关联了JDK可能会导致报错信息,提示找不到相关的代码。
如果出于某些特殊需要必须关联JDK,建议在Project Structure->Project Settings->Modules->Dependencies选项卡下调整源码识别优先级,将<Module source>调整到列表首位,可以使得源码跳转中优先跳转到本项目自身的源码里。
-
由于时间关系,本人未对所有代码一一测试。所以,如果因为某个源文件异常或缺失而导致IDE报警告信息或者报错误提示的话,解决方案有两个:
- 如果代码对你很重要,影响到你对某个方法的理解,请自行到Google搜索相关源文件导入到项目中合适的位置
- 如果仅仅是因为显示的异常信息造成了视觉上的干扰,请在IDE中自行设置语法高亮形式。比如在IDEA中阅读此项目时,我会关闭Settings->Editor->Color Scheme->General中关于错误、警告、非法符号的报错提示,并且关闭Settings->Editor->Inspections处的语法检测信息。(当然,这两个地方的设置均支持备份与自定义,所以建议不要直接在原设置上修改,而是新建一份设置再去修改比较好,以方便在不同项目之间切换规则)
-
欢迎反馈好的想法、建议、意见。
项目提交信息中的emoji取自gitmoji。
- VoidTest - java.lang.Void
VoidTest01Void在反射中的使用VoidTest02Void在泛型中的使用
- StringCharacterIteratorTest - java.text.StringCharacterIterator
StringCharacterIteratorTest01双向遍历String
- BreakIteratorTest - 分词器对字符、单词、行、语句的分割
BreakIteratorTest01分词器对字符(Unicode符号)的分割BreakIteratorTest02分词器对单词的分割BreakIteratorTest03分词器对行的分割BreakIteratorTest04分词器对句子的分割
- ByteOrderTest - 当前系统字节顺序
ByteOrderTest01查看当前系统存储数据用的是大端法还是小端法
- UnsafeTest - 测试Unsafe类常用操作,注意设置JDK>=8或OpenJDK>=9
UnsafeTest00获取Unsafe实例,并借助Unsafe创建其他类的对象UnsafeTest01获取字段地址,获取字段地址处的值,为某地址处的字段赋值UnsafeTest02对JVM内存中某对象的数组字段/变量直接操作UnsafeTest03本地内存操作UnsafeTest04利用Unsafe#objectFieldOffse方法获取某个对象的近似大小
- ReferenceTest - 软引用、弱引用、虚引用测试
ReferenceTest01软引用SoftReference回收测试ReferenceTest02弱引用WeakReference回收测试ReferenceTest03虚引用PhantomReference回收测试
- CleanerTest - 清洁器测试
CleanerTest01创建Cleaner,注册追踪的对象和回调动作
- StreamTest - 流
StreamTest01Stream的简单使用StreamTest02filter测试StreamTest03map测试StreamTest04flatMap测试StreamTest05peek测试StreamTest06distinct测试StreamTest07sorted测试StreamTest08limit测试StreamTest09skip测试StreamTest10Stream短路操作测试StreamTest11Optional测试StreamTest12forEach测试StreamTest13reduce测试StreamTest14min和max测试StreamTest15count测试StreamTest16collect测试StreamTest17Collector(收集器)测试