描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111670315丛书名: Java核心技术系列
(1)作者是阿里云Java技术专家,热衷于研究编程语言的设计与实现,对Java虚拟机和编译器都有较深入的研究。
(2)深入分析HotSpot VM的核心源码,全面解析运行时、垃圾回收器、即时编译器的实现原理和工作机制
(3)详细描述虚拟机底层实现,同时与上层Java应用和库相结合,为JVM的开发、调优和排错指明方向
很多JVM的底层技术细节你是否只了解表面?
面对JVM Crash或性能调优方面的问题时你是否会束手无策?
面对上层Java应用发生的偏离预期的行为是否会不知所措?
……
这本书以源码分析为基础,从运行时、垃圾回收器、即时编译器3个维度全面、深入解析HotSpot VM的底层实现和工作机制,同时与上层的Java语言和库结合,指导读者解决JVM开发、JVM调优和JVM排错方面遇到的各种问题。
广度与深度兼顾:广度上涵盖Graal VM、CDS、Instrumentation、编译重放、非标准字节码、RTM锁、JIT调试工具、EpsilonGC/ShenandoahGC/ZGC、G1字符串去重等重要知识点;深度上深入解析了C1、C2、G1GC、ObjectMonitor、Mutex、模板解释器等的底层实现。
全书共 11 章,参考 OpenJDK 社区的划分方式来组织内容,分为运行时、即时编译器、垃圾回收器三个部分。
第壹部分(第1~6章) 运行时
首先,从Java生态系统的角度,简单介绍了JDK、JVM、JEP、HotSpot VM、Graal VM,引导读者快速进入Java虚拟机的世界;然后从源码的角度深入解析了HotSpot VM的类可用机制、对象和类、运行时、模板解释器和并发设施。
第二部分(第7~9章) 即时编译器
首先重点介绍了即时编译器技术、编译理论、编译器调试方法等编译器的基础知识;然后详细讲解了C1和C2两个即时编译器的实现原理、工作机制和优化方法。
第三部分(第10~11章) 垃圾回收器
首先全面介绍了Epsilon GC、Serial GC、Parallel GC、CMS GC、G1 GC、Shenandoah GC、ZGC等各种垃圾回收器,然后重点剖析了G1 GC。
前 言
第1章 Java大观园 1
1.1 OpenJDK 1
1.2 JEP 2
1.3 Java虚拟机 4
1.4 HotSpot VM 5
1.4.1 源码模块 7
1.4.2 构建和调试 7
1.4.3 回归测试 12
1.5 Graal VM 14
1.6 本章小结 16
第2章 类可用机制 17
2.1 类的加载 17
2.1.1 字节码 17
2.1.2 类加载器 19
2.1.3 文件解析 21
2.2 类的链接 23
2.2.1 字节码验证 24
2.2.2 字节码重写 24
2.2.3 方法链接 26
2.3 类的初始化 32
2.4 类的重定义 35
2.5 本章小结 36
第3章 对象和类 38
3.1 对象与类 38
3.2 对象 39
3.2.1 创建对象 39
3.2.2 对象头 41
3.2.3 对象哈希值 43
3.3 类 44
3.3.1 字段遍历 45
3.3.2 虚表 46
3.4 本章小结 48
第4章 运行时 49
4.1 线程创生纪 49
4.1.1 容器化支持 51
4.1.2 Java线程 52
4.1.3 虚拟机线程 54
4.1.4 编译器线程 57
4.1.5 服务线程 58
4.1.6 计时器线程 58
4.2 Java线程 58
4.2.1 线程启动 60
4.2.2 线程停止 61
4.2.3 睡眠与中断 63
4.3 栈帧 66
4.4 Java/JVM沟通 68
4.4.1 JNI 69
4.4.2 JavaCalls 72
4.5 Unsafe类 74
4.5.1 堆外内存 75
4.5.2 内存屏障 75
4.5.3 阻塞和唤醒 76
4.5.4 对象数据修改 76
4.6 本章小结 77
第5章 模板解释器 78
5.1 解释器体系 78
5.1.1 C 解释器行为 78
5.1.2 模板解释器行为 79
5.2 机器代码片段 81
5.3 CodeCache 82
5.4 指令缓存刷新 84
5.5 解释器生成 86
5.5.1 普通方法入口 86
5.5.2 方法加锁 89
5.5.3 本地方法入口 90
5.5.4 标准字节码 91
5.5.5 非标准字节码 106
5.6 本章小结 107
第6章 并发设施 108
6.1 指令重排序 108
6.1.1 编译器重排序 109
6.1.2 处理器重排序 110
6.2 内存模型 112
6.2.1 happens-before内存模型 113
6.2.2 Java内存模型 114
6.3 基础设施 116
6.3.1 原子操作 116
6.3.2 ParkEvent 116
6.3.3 Parker 118
6.3.4 Monitor 120
6.4 锁优化 126
6.4.1 偏向锁 127
6.4.2 基本对象锁 128
6.4.3 重量级锁 128
6.4.4 RTM锁 131
6.5 本章小结 132
第7章 编译概述 133
7.1 编译器简介 133
7.1.1 运行时代码生成 134
7.1.2 JIT编译器 135
7.1.3 AOT编译器 136
7.1.4 JVMCI JIT编译器 136
7.2 即时编译技术 137
7.2.1 分层编译 137
7.2.2 栈上替换 138
7.2.3 退优化 139
7.3 编译理论基础 139
7.3.1 中间表示 139
7.3.2 基本块与控制流图 140
7.3.3 静态单赋值 142
7.3.4 规范化 142
7.3.5 值编号 143
7.3.6 自顶向下重写系统 144
7.3.7 循环不变代码外提概述 144
7.4 调试方法 145
7.4.1 编译日志 145
7.4.2 编译神谕 146
7.4.3 可视化工具 146
7.5 本章小结 149
第8章 C1编译器 150
8.1 编译流程 150
8.1.1 进入C1 150
8.1.2 高级中间表示 152
8.1.3 低级中间表示 153
8.2 从字节码到HIR 155
8.2.1 识别基本块 155
8.2.2 抽象解释 156
8.3 HIR代码优化 158
8.3.1 规范化 158
8.3.2 内联 159
8.3.3 基本块优化 160
8.3.4 值编号 160
8.3.5 数组范围检查 162
8.3.6 循环不变代码外提 162
8.4 从HIR到LIR 164
8.4.1 return生成 165
8.4.2 new生成 165
8.4.3 goto生成 166
8.4.4 线性扫描寄存器分配 167
8.5 本章小结 171
第9章 C2编译器 172
9.1 编译流程 172
9.1.1 进入C2 172
9.1.2 理想图 174
9.1.3 理想图流程概述 180
9.1.4 C2代码优化 183
9.1.5 代码生成流程 185
9.1.6 设置机器代码 186
9.2 构造理想图 187
9.2.1 构造示例 187
9.2.2 Identity、Ideal、GVN 191
9.3 机器无关优化 193
9.3.1 IGVN 193
9.3.2 逃逸分析 194
9.3.3 向量化 197
9.4 代码生成 199
9.4.1 指令选择 199
9.4.2 图着色寄存器分配 200
9.5 本章小结 203
第10章 垃圾回收 204
10.1 垃圾回收基础概述 204
10.1.1 GC Root 205
10.1.2 安全点 206
10.1.3 线程局部握手 208
10.1.4 GC屏障 209
10.2 Epsilon GC 209
10.2.1 源码结构 209
10.2.2 EpsilonHeap 210
10.2.3 对象分配 211
10.2.4 回收垃圾 212
10.3 Serial GC 212
10.3.1 弱分代假说
为何写作本书
Java语言已经走过了20多个年头,在此期间虽然新语言层出不穷,但是都没有撼动Java的位置。可能是历史选择了Java,也可能是Java改变了历史,总之,Java无疑是一门成功的编程语言。这门语言之所以能如此成功,高性能语言虚拟机HotSpot功不可没。
客观地说,HotSpot VM是目前顶级的语言虚拟机之一,它的模板解释器是语言解释器的最终状态,除非有重大技术突破和方法论的改变,否则很难被超越。它的垃圾回收器也日臻完善,新的无停顿GC的出现标志着JVM正在迈向GC顶级俱乐部。它的即时编译器是权衡编译开销与应用吞吐量后得到的一个卓越且精湛的艺术品。
本书始于笔者博客上的系列文章,随着博文连载,便想将博文整理成册,以系统性地讨论HotSpot VM。鉴于OpenJDK社区将HotSpot VM分为运行时、编译器、垃圾回收器三个部分,本书也采用这种划分方式来组织内容。
本书读者对象
本书内容涉及较多的源码分析,所以除了需要读者具有基本的Java/JVM知识,也需要读者具有基本的C 语言常识。本书适合那些希望在Java语言方面有进一步提升的开发者,也适合任何对JVM底层感兴趣且想要一探究竟的开发者。同时,对编译器或垃圾回收器感兴趣的读者也能从中受益。
本书特色
本书既考虑到内容的广度也关注了技术的深度,详细描述了虚拟机的底层实现,并与上层Java语言或者库结合,以实用为目标展开介绍,同时还讨论了它们的深刻意义。
从内容广度的角度看,本书除了讨论耳熟能详的Java虚拟机技术外,还详细讨论了业界最新的通用虚拟机平台Graal VM、CDS/AppCDS/DynamicCDS、Instrumentation库、编译重放、非标准字节码、栈上替换,RTM锁、JIT编译器IR、JIT编译器可视化工具、编译逃离、EpsilonGC/ShenandoahGC/ZGC、G1字符串去重等技术,其中部分技术代表了社区的最新动向。
从内容深度的角度看,本书详细讨论了:
G1 GC的回收策略和底层代码实现;
C1编译器的HIR和LIR,以及针对不同IR上应用的优化;
C2编译器的Ideal Graph以及平台无关的优化技术;
CPU重排序与ObjectMonitor、Mutex的底层实现;
模板解释器的代码片段生成逻辑和字节码模板生成逻辑;
……
其中涉及的部分技术是Java虚拟机高性能的最终保证。
如何阅读本书
本书共11章,参考OpenJDK社区的划分方式,全书从逻辑上可分为运行时、编译器、垃圾回收器三个部分。
第一部分(第1~6章),介绍Java虚拟机运行时的相关知识;
第二部分(第7~9章),介绍编译基础知识和虚拟机的两个即时编译器;
第三部分(第10~11章),介绍各种垃圾回收器并深入分析G1 GC。
每个部分总体侧重某一个大的方向,但每个章节的独立性都较强,各章节间没有必然的联系。对于Java虚拟机相关技术知识储备充足、经验丰富的读者,可以按目录“索骥”,选择自己感兴趣的内容阅读。当然,推荐从第1章开始顺序阅读。
另外,因为HotSpot源码很多,出于篇幅考虑,本书在进行代码分析时,大多只给出了代码片段或者主要的函数名称,故建议读者使用带有全局文本搜索功能的编辑器或者IDE(如VSCode、IntelliJ IDEA、Sublime Text)来阅读本书。
本书内容翔实,结合实际工作中的具体问题,对JVM进行了深入、全方位的剖析,如栈上替换、模板解释器、即时编译器、AppCDS、RTM锁、编译重放,等等。无论是上层架构,还是底层设计,都娓娓道来, 无论是Java开发者还是C 开发者,都值得认真一读,强烈推荐。
—— 赵海平 前Facebook首席工程师,前阿里巴巴高级研究员
想要编写出优秀的软件,就势必要对已有的、底层的软件栈有清晰的了解,这样才能在遇到麻烦时直指问题核心,在设计新方案时总览全局。很高兴看到本书的出版,它不仅讲解了运行时、即时编译器、垃圾回收器的原理,还从当今应用*广泛的Java语言实现——HotSpot VM出发,配合代码示例、算法图解、调试技巧,帮助读者跨越学习中理论和实践的鸿沟。如果你在平时的工作学习中需要大量使用Java,想要提升软件开发和调试的效率,又恰好对每天使用的工具的内部黑魔法感兴趣,那么这本书将给你惊喜。
—— 彭飞 NVIDIA高级编译器工程师
大多数程序员都有中年危机,而深入研究技术,将技术做深、做精、做专是技术人员避免中年危机的明智之举。对于Java程序员来说,这本书能带你走向Java底层,深入了解HotSpot虚拟机的运行原理与实现机制,是走向Java技术*的优选。
—— 马智 《深入解析Java编译器:源码剖析与实例详解》作者
评论
还没有评论。