[套装书]深入解析Java虚拟机HotSpot+深入理解Android:Java虚拟机ART(2册)

作者
杨易 邓凡平
丛书名
Java核心技术系列
出版社
机械工业出版社
ISBN
9782101129253
简要
简介
很多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。 . ---------------------------深入理解Android:Java虚拟机ART---------------------------
目录



---------------------------深入解析Java虚拟机HotSpot---------------------------


前  言
第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 弱分代假说 212
10.3.2 卡表 213
10.3.3 Young GC 214
10.3.4 Full GC 218
10.3.5 世界停顿 221
10.4 Parallel GC 221
10.4.1 多线程垃圾回收 221
10.4.2 GC任务管理器 223
10.4.3 并行与并发 226
10.5 CMS GC 227
10.5.1 回收策略 227
10.5.2 对象丢失问题 228
10.5.3 Old GC周期 229
10.5.4 并发模式失败 234
10.5.5 堆碎片化 235
10.6 G1 GC 235
10.6.1 简介 235
10.6.2 混合回收 236
10.7 Shenandoah GC 237
10.8 ZGC 239
10.9 本章小结 241
第11章 G1 GC 242
11.1 G1 GC简介 242
11.1.1 基于Region的堆 242
11.1.2 记忆集RSet 243
11.1.3 停顿预测模型 244
11.2 Young GC 245
11.2.1 选择CSet 245
11.2.2 清理根集 246
11.2.3 处理RSet 247
11.2.4 对象复制 247
11.3 Mixed GC 248
11.3.1 SATB 249
11.3.2 全局并发标记 251
11.3.3 对象复制 254
11.4 Full GC 254
11.5 字符串去重 255
11.6 本章小结 257



---------------------------深入理解Android:Java虚拟机ART---------------------------


推荐序
前言
第1章 本书必读1
1.1 概述1
1.2 准备环境和工具2
1.2.1 准备源代码2
1.2.2 准备Source Insight2
1.2.3 准备模拟器和自制系统镜像5
1.2.4 小结8
1.3 本书的内容9
1.4 本书资源下载说明12
第2章 深入理解Class文件格式13
2.1 Class文件格式总览13
2.2 常量池及相关内容14
2.2.1 常量项的类型和关系14
2.2.2 信息描述规则18
2.2.3 常量池实例剖析19
2.3 field_info和method_info19
2.4 access_flags介绍21
2.5 属性介绍22
2.5.1 属性概貌22
2.5.2 Code属性23
2.5.3 LineNumberTable属性25
2.5.4 LocalVariableTable属性26
2.6 Java指令码介绍27
2.6.1 指令码和助记符27
2.6.2 如何阅读规范28
2.7 学习路线推荐30
2.8 参考资料30
第3章 深入理解Dex文件格式31
3.1 Dex文件格式总览31
3.1.1 Dex和Class文件格式的区别31
3.1.2 Dex文件格式的概貌35
3.2 认识Dex文件36
3.2.1 header_item36
3.2.2 string_id_item等37
3.2.3 class_def38
3.2.4 code_item40
3.3 Dex指令码介绍41
3.3.1 insns的组织形式41
3.3.2 指令码描述规则42
3.4 学习路线推荐44
3.5 参考资料45
第4章 深入理解ELF文件格式46
4.1 概述46
4.2 ELF文件格式介绍46
4.2.1 ELF文件头结构介绍47
4.2.2 Linking View下的ELF52
4.2.3 Execution View下的ELF61
4.2.4 实例分析:调用动态库中的函数65
4.2.5 ELF总结72
4.3 学习路线推荐73
4.4 参考资料73
第5章 认识C++1174
5.1 数据类型76
5.1.1 基本内置数据类型介绍76
5.1.2 指针、引用和void类型77
5.1.3 字符和字符串81
5.1.4 数组82
5.2 C++源码构成及编译83
5.2.1 头文件示例83
5.2.2 源文件示例85
5.2.3 编译86
5.3 Class介绍88
5.3.1 构造、赋值和析构函数89
5.3.2 类的派生和继承97
5.3.3 友元和类的前向声明103
5.3.4 explicit构造函数105
5.3.5 C++中的struct106
5.4 操作符重载106
5.4.1 操作符重载的实现方式107
5.4.2 输出和输入操作符重载108
5.4.3 ->和*操作符重载110
5.4.4 new和delete操作符重载111
5.4.5 函数调用运算符重载117
5.5 函数模板与类模板118
5.5.1 函数模板119
5.5.2 类模板122
5.6 lambda表达式125
5.7 STL介绍127
5.7.1 string类128
5.7.2 容器类129
5.7.3 算法和函数对象介绍134
5.7.4 智能指针类138
5.7.5 探讨STL的学习140
5.8 其他常用知识141
5.8.1 initializer_list141
5.8.2 带作用域的enum141
5.8.3 constexpr142
5.8.4 static_assert143
5.9 参考资料143
第6章 编译dex字节码为机器码145
6.1 编译器全貌介绍147
6.2 编译器前端介绍150
6.2.1 词法分析和lex151
6.2.2 语法分析和yacc160
6.2.3 语义分析和IR生成介绍171
6.3 优化器介绍175
6.3.1 构造CFG176
6.3.2 分析和处理CFG181
6.3.3 数据流分析与SSA191
6.3.4 IR优化204
6.4 ART中的IR—HInstruction222
6.4.1 ART中的IR222
6.4.2 IR之间的关系225
6.4.3 ART IR对象的初始化231
6.5 寄存器分配233
6.5.1 LSRA介绍235
6.5.2 LSRA相关代码介绍247
6.6 机器码生成相关代码介绍271
6.6.1 GenerateFrameEntry272
6.6.2 VisitAdd和VisitInstance-FieldGet273
6.6.3 GenerateSlowPaths275
6.7 总结277
6.8 参考资料280
第7章 虚拟机的创建283
7.1 概述284
7.1.1 JniInvocation Init函数介绍286
7.1.2 AndroidRuntime startVm函数介绍287
7.2 Runtime Create介绍288
7.2.1 Create函数介绍288
7.2.2 Init函数介绍290
7.3 MemMap与OatFileManager293
7.3.1 MemMap介绍293
7.3.2 OatFileManager介绍298
7.4 FaultManager介绍302
7.4.1 信号处理和SignalAction介绍302
7.4.2 FaultManager介绍307
7.5 Thread介绍311
7.5.1 Startup函数介绍311
7.5.2 Attach函数介绍312
7.6 Heap学习之一325
7.6.1 初识Heap中的关键类326
7.6.2 Heap构造函数第一部分337
7.7 JavaVMExt和JNIEnvExt340
7.7.1 JavaVMExt341
7.7.2 JNIEnvExt343
7.7.3 总结344
7.8 ClassLinker345
7.8.1 关键类介绍345
7.8.2 ClassLinker构造函数352
7.8.3 InitFromBootImage353
7.8.4 ClassLinker总结360
7.9 总结和阅读指导362
第8章 虚拟机的启动363
8.1 Runtime Start364
8.2 初识JNI365
8.2.1 JNI中的数据类型365
8.2.2 ScopedObjectAccess等辅助类367
8.2.3 常用JNI函数介绍369
8.3 Jit LoadCompilerLibrary373
8.4 Runtime InitNativeMethods374
8.4.1 JniConstants Init374
8.4.2 RegisterRuntimeNative Methods375
8.4.3 WellKnownClasses Init和LastInit376
8.5 Thread相关376
8.5.1 Runtime InitThreadGroups377
8.5.2 Thread FinishSetup377
8.5.3 Runtime StartDaemonThreads380
8.6 Runtime CreateSystemClassLoader381
8.7 类的加载、链接和初始化383
8.7.1 关键类介绍383
8.7.2 SetupClass392
8.7.3 LoadClass相关函数393
8.7.4 LinkClass相关函数398
8.7.5 DefineClass414
8.7.6 Verify相关函数416
8.7.7 Initialize相关函数424
8.7.8 ClassLinker中其他常用函数426
8.7.9 ClassLoader介绍437
8.8 虚拟机创建和启动关键内容梳理445
第9章 深入理解dex2oat447
9.1 概述448
9.2 ParseArgs介绍452
9.2.1 CompilerOptions类介绍453
9.2.2 ProcessOptions函数介绍454
9.2.3 InsertCompileOptions函数介绍455
9.3 OpenFile介绍456
9.4 Setup介绍458
9.4.1 Setup代码分析之一458
9.4.2 Setup代码分析之二464
9.4.3 Setup代码分析之三474
9.4.4 Setup代码分析之四484
9.5 CompileImage484
9.5.1 Compile485
9.5.2 ArtCompileDEX496
9.5.3 OptimizingCompiler JniCompile499
9.5.4 OptimizingCompiler Compile527
9.6 OAT和ART文件格式介绍544
9.6.1 OAT文件格式544
9.6.2 ART文件格式550
9.6.3 oatdump介绍554
9.7 总结561
第10章 解释执行和JIT562
10.1 基础知识564
10.1.1 LinkCode564
10.1.2 Runtime ArtMethod566
10.1.3 栈和参数传递572
10.2 解释执行580
10.2.1 art_quick_to_interpreter_bridge580
10.2.2 artQuickToInterpreter-Bridge582
10.2.3 EnterInterpreterFromEntry-Point584
10.2.4 调用栈的管理和遍历593
10.3 ART中的JIT599
10.3.1 Jit、JitCodeCache等600
10.3.2 JIT阈值控制与处理609
10.3.3 OSR的处理612
10.4 HDeoptimize的处理615
10.4.1 VisitDeoptimize相关616
10.4.2 QuickExceptionHandler相关618
10.4.3 解释执行中关于Deoptimize的处理621
10.5 Instrumentation介绍623
10.5.1 MethodEnterEvent和MethodExitEvent624
10.5.2 DexPcMovedEvent625
10.6 异常投递和处理625
10.6.1 抛异常626
10.6.2 异常处理629
10.7 总结635
第11章 ART中的JNI636
11.1 JavaVM和JNIEnv637
11.1.1 JavaVMExt相关介绍638
11.1.2 JNIEnvExt介绍642
11.2 Java native方法的调用644
11.2.1 art_jni_dlsym_lookup_stub644
11.2.2 art_quick_generic_jni_trampoline646
11.3 CallStaticVoidMethod651
11.4 JNI中引用型对象的管理653
11.4.1 关键类介绍653
11.4.2 JniMethodStart和JniMethod-End657
11.4.3 IndirectReferenceTable相关函数658
11.4.4 NewObject和jobject的含义660
11.4.5 JNI中引用对象相关662
11.4.6 PushLocalFrame和PopLocalFrame663
11.4.7 回收引用对象664
11.5 总结666
第12章 CheckPoints、线程同步及信号处理668
12.1 CheckPoints介绍669
12.1.1 设置Check Point标志位670
12.1.2 Check Points的设置672
12.1.3 执行检查点处的任务676
12.2 ThreadList和ThreadState681
12.2.1 线程ID683
12.2.2 RunCheckpoint和Dump684
12.2.3 SuspendAll和ResumeAll687
12.2.4 Thread状态切换690
12.3 线程同步相关知识691
12.3.1 关键类介绍692
12.3.2 synchronized的处理697
12.3.3 Object wait、notifyAll等705
12.4 volatile成员的读写707
12.4.1 基础知识707
12.4.2 解释执行模式下的处理711
12.4.3 机器码执行模式的处理712
12.5 信号处理714
12.5.1 zygote进程的处理714
12.5.2 非zygote进程的处理716
12.6 总结719
第13章 内存分配与释放720
13.1 Space等关键类介绍722
13.2 ZygoteSpace723
13.3 BumpPointerSpace和RegionSpace725
13.3.1 BumpPointerSpace726
13.3.2 RegionSpace733
13.4 DlMallocSpace和RosAlloc-Space740
13.4.1 DlMallocSpace741
13.4.2 RosAllocSpace745
13.4.3 rosalloc介绍748
13.5 LargeObjectMapSpace760
13.6 new-instance/array指令的处理762
13.6.1 设置内存分配器762
13.6.2 解释执行模式下的处理767
13.6.3 机器码执行模式下的处理770
13.6.4 Heap AllocObjectWith-Allocator773
13.7 细观Space779
13.7.1 Space类779
13.7.2 ContinuousSpace和Discon-tinuousSpace类781
13.7.3 MemMapSpace和Continuous MemMapAllocSpace类782
13.7.4 MallocSpace类783
13.8 Heap学习之二784
13.8.1 Heap构造函数784
13.8.2 关键类介绍792
13.8.3 ObjectVisitReferences806
13.9 总结812
第14章 ART中的GC813
14.1 GC基础知识814
14.1.1 Mark-Sweep Collection原理介绍815
14.1.2 Copying Collection原理介绍817
14.1.3 Mark-Compact Collection原理介绍818
14.1.4 其他概念819
14.2 Runtime VisitRoots819
14.2.1 关键数据结构821
14.2.2 Thread VisitRoots824
14.3 ART GC概览827
14.3.1 关键数据结构827
14.3.2 ART GC选项830
14.3.3 创建回收器和设置回收策略832
14.4 MarkSweep835
14.4.1 Heap相关成员变量取值情况835
14.4.2 MarkSweep概貌837
14.4.3 MarkingPhase840
14.4.4 PausePhase848
14.4.5 ReclaimPhase851
14.4.6 FinishPhase857
14.4.7 PartialMarkSweep857
14.4.8 StickyMarkSweep858
14.4.9 Concurrent MarkSweep864
14.4.10 Parallel GC868
14.4.11 MarkSweep小结869
14.5 ConcurrentCopying870
14.5.1 InitalizePhase871
14.5.2 FlipThreadRoots873
14.5.3 MarkingPhase881
14.5.4 ReclaimPhase883
14.5.5ConcurrentCopying小结885
14.6 MarkCompact885
14.6.1 MarkingPhase886
14.6.2 ReclaimPhase889
14.6.3 MarkCompact小结891
14.7 SemiSpace892
14.7.1 InitializePhase893
14.7.2 MarkingPhase894
14.7.3 SemiSpace小结898
14.8 Java Reference对象的处理899
14.8.1 基础知识899
14.8.2 MarkSweep中Reference对象的处理903
14.8.3ReferenceProcessor904
14.8.4 PhantomReference的处理912
14.8.5 finalize函数的调用913
14.8.6 Reference处理小结917
14.9 Heap学习之三917
14.9.1 Heap Trim917
14.9.2 CollectGarbageInternal919
14.9.3 PreZygoteFork924
14.9.4 内存碎片的解决926
14.10 总结927
14.11 参考资料928

推荐

车牌查询
桂ICP备20004708号-3