作者 |
杨易 蒂姆·林霍尔姆 弗兰克·耶林 吉拉德·布拉查 亚历克斯·巴克利 |
丛书名 |
Java核心技术系列 |
出版社 |
机械工业出版社 |
ISBN |
9782101129220 |
简要 |
简介 |
很多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。 . ---------------------------Java虚拟机规范(Java SE 8版)--------------------------- 本书由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于最新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。 本书共分7章。第1章从宏观的角度介绍了Java虚拟机与Java的关系及发展历程;第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的class文件格式;第5章定义Java虚拟机启动以及类与接口的加载、链接和初始化过程;第6章阐释并列举Java虚拟机指令集;第7章提供一张以操作码值为索引的Java虚拟机操作码助记符表。 |
目录 |
---------------------------深入解析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 ---------------------------Java虚拟机规范(Java SE 8版)--------------------------- 译者序 前 言 第1章 引言1 1.1 简史1 1.2 Java虚拟机2 1.3 各章节摘要2 1.4 说明3 1.5 反馈3 第2章 Java虚拟机结构4 2.1 class文件格式4 2.2 数据类型5 2.3 原始类型与值5 2.3.1 整数类型与整型值6 2.3.2 浮点类型、取值集合及浮点值6 2.3.3 returnAddress类型和值8 2.3.4 boolean类型8 2.4 引用类型与值9 2.5 运行时数据区9 2.5.1 pc寄存器9 2.5.2 Java虚拟机栈10 2.5.3 Java堆10 2.5.4 方法区11 2.5.5 运行时常量池11 2.5.6 本地方法栈12 2.6 栈帧12 2.6.1 局部变量表13 2.6.2 操作数栈14 2.6.3 动态链接14 2.6.4 方法调用正常完成15 2.6.5 方法调用异常完成15 2.7 对象的表示15 2.8 浮点算法15 2.8.1 Java虚拟机和IEEE 754中的浮点算法15 2.8.2 浮点模式16 2.8.3 数值集合转换17 2.9 特殊方法18 2.10 异常19 2.11 字节码指令集简介20 2.11.1 数据类型与Java虚拟机21 2.11.2 加载和存储指令23 2.11.3 算术指令24 2.11.4 类型转换指令25 2.11.5 对象的创建与操作27 2.11.6 操作数栈管理指令27 2.11.7 控制转移指令27 2.11.8 方法调用和返回指令28 2.11.9 抛出异常28 2.11.10 同步28 2.12 类库29 2.13 公有设计、私有实现30 第3章 Java虚拟机编译器31 3.1 示例的格式说明31 3.2 常量、局部变量和控制结构的使用32 3.3 算术运算36 3.4 访问运行时常量池36 3.5 与控制结构有关的更多示例37 3.6 接收参数40 3.7 方法调用41 3.8 使用类实例43 3.9 数组44 3.10 编译switch语句46 3.11 使用操作数栈48 3.12 抛出异常和处理异常48 3.13 编译finally语句块51 3.14 同步54 3.15 注解55 第4章 class文件格式56 4.1 ClassFile结构57 4.2 各种名称的内部表示形式61 4.2.1 类和接口的二进制名称61 4.2.2 非限定名61 4.3 描述符62 4.3.1 语法符号62 4.3.2 字段描述符62 4.3.3 方法描述符63 4.4 常量池64 4.4.1 CONSTANT_Class_info结构65 4.4.2 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info结构66 4.4.3 CONSTANT_String_info结构67 4.4.4 CONSTANT_Integer_info和CONSTANT_Float_info结构67 4.4.5 CONSTANT_Long_info和CONSTANT_Double_info结构68 4.4.6 CONSTANT_NameAnd-Type_info结构69 4.4.7 CONSTANT_Utf8_info结构70 4.4.8 CONSTANT_MethodHandle_info结构72 4.4.9 CONSTANT_MethodType_info结构73 4.4.10 CONSTANT_Invoke-Dynamic_info结构74 4.5 字段74 4.6 方法76 4.7 属性78 4.7.1 自定义和命名新的属性82 4.7.2 ConstantValue属性82 4.7.3 Code属性83 4.7.4 StackMapTable属性86 4.7.5 Exceptions属性92 4.7.6 InnerClasses属性93 4.7.7 EnclosingMethod属性95 4.7.8 Synthetic属性96 4.7.9 Signature属性96 4.7.10 SourceFile属性100 4.7.11 SourceDebugExtension属性101 4.7.12 LineNumberTable属性102 4.7.13 LocalVariableTable属性103 4.7.14 LocalVariableTypeTable属性104 4.7.15 Deprecated属性106 4.7.16 RuntimeVisibleAnnota-tions属性106 4.7.17 RuntimeInvisible-Annotations属性110 4.7.18 RuntimeVisibleParameterAnnotations属性111 4.7.19 RuntimeInvisiblePara-meterAnnotations属性112 4.7.20 RuntimeVisibleTypeAnnotations属性114 4.7.21 RuntimeInvisibleType-Annotations属性124 4.7.22 AnnotationDefault属性125 4.7.23 BootstrapMethods属性126 4.7.24 MethodParameters属性127 4.8 格式检查129 4.9 Java虚拟机代码约束129 4.9.1 静态约束130 4.9.2 结构化约束132 4.10 class文件校验135 4.10.1 类型检查验证136 4.10.2 类型推导验证200 4.11 Java虚拟机限制206 第5章 加载、链接与初始化208 5.1 运行时常量池208 5.2 虚拟机启动210 5.3 创建和加载211 5.3.1 使用引导类加载器来加载类型212 5.3.2 使用用户自定义类加载器来加载类型212 5.3.3 创建数组类213 5.3.4 加载限制214 5.3.5 从class文件表示得到类214 5.4 链接215 5.4.1 验证216 5.4.2 准备216 5.4.3 解析217 5.4.4 访问控制225 5.4.5 方法覆盖225 5.5 初始化226 5.6 绑定本地方法实现228 5.7 Java虚拟机退出228 第6章 Java虚拟机指令集229 6.1 设定:“必须”的含义229 6.2 保留操作码229 6.3 虚拟机错误230 6.4 指令描述格式230 6.5 指令集描述232 第7章 操作码助记符320 附录A Limited License Grant327 |