书籍详情
深入剖析Java虚拟机:源码剖析与实例详解(基础卷)
作者:马智 著
出版社:机械工业出版社
出版时间:2021-09-01
ISBN:9787111689898
定价:¥149.00
购买这本书可以去
内容简介
《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》以流行的工业级Java虚拟机HotSpot为基础,详细剖析其基础功能模块的源码,力求讲清楚每个重要技术的原理和实现细节,同时结合大量实例和图示帮助读者更好地理解所讲内容。《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》没有介绍Java运行时的栈结构,以及解释执行与编译执行等知识点,这些内容在《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》的姊妹篇《深入剖析Java虚拟机:源码剖析与实例详解(运行时卷)》一书中进行详细的介绍。 《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》共13章,章节顺序基本上是按照类的生命周期进行编排的。《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》涵盖的主要内容有HotSpot VM简介、对象的二分模型、类的加载机制、类与常量池的解析、字段的解析、方法的解析、类的连接与初始化、运行时数据区、类对象的创建和初始化、Serial垃圾收集器、Serial Old垃圾收集器以及Java引用类型的实现原理等。 《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》主要面向想要深入学习和研究Java语言运行原理的人,尤其是正在从事或将来想要从事虚拟机开发的编程人员。另外,《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》还非常适合Java求职人员阅读,可以帮助他们系统掌握虚拟机的相关知识,从而游刃有余地应对相关公司招聘时的考查。
作者简介
马智有多年的Java开发经验,先后在掌游天下和京东集团任软件研发工程师。对编程语言的底层实现有浓厚的兴趣,深入研究过OpenJDK的源码实现。著有《深入解析Java编译器:源码剖析与实例详解》一书,颇受读者好评。
目录
前言
第1章 认识HotSpot VM 1
1.1 初识JVM 1
1.2 编译OpenJDK 8 3
1.2.1 准备编译环境 3
1.2.2 下载源代码 3
1.2.3 编译源代码 4
1.2.4 通过GDB调试源代码 6
1.2.5 通过Eclipse调试源代码 7
1.3 HotSpot VM源代码结构 9
1.4 启动HotSpot VM 11
第2章 二分模型 17
2.1 Java类的表示——Klass 17
2.1.1 Klass类 18
2.1.2 InstanceKlass类 26
2.1.3 InstanceKlass类的子类 29
2.1.4 ArrayKlass类 34
2.1.5 TypeArrayKlass类 35
2.1.6 ObjArrayKlass类 40
2.2 Java对象的表示——oop 46
2.2.1 oopDesc类 46
2.2.2 markOopDesc类 48
2.2.3 instanceOopDesc类 49
2.2.4 arrayOopDesc类 51
2.2.5 arrayOopDesc类的子类 51
2.3 操作句柄——Handle 54
2.3.1 句柄Handle的定义与创建 55
2.3.2 句柄Handle的释放 57
第3章 类的加载 62
3.1 类加载器 62
3.1.1 引导类加载器/启动类加载器 62
3.1.2 扩展类加载器 64
3.1.3 应用类加载器/系统类加载器 65
3.1.4 构造类加载器实例 65
3.1.5 类的双亲委派机制 68
3.2 预加载类 83
3.2.1 核心类的预加载 83
3.2.2 数组的预加载 87
3.3 Java主类的装载 88
3.4 触发类的装载 94
第4章 类与常量池的解析 97
4.1 类的解析 97
4.1.1 Class文件格式 97
4.1.2 ClassFileParser类简介 98
4.1.3 ClassFileStream类简介 99
4.1.4 解析类文件 102
4.1.5 保存解析结果 109
4.2 常量池的解析 116
4.2.1 ConstantPool类 117
4.2.2 创建ConstantPool实例 117
4.2.3 解析常量池项 122
第5章 字段的解析 136
5.1 字段的解析基础 136
5.1.1 FieldAllocationCount与FieldAllocationType类 136
5.1.2 为字段分配内存空间 139
5.1.3 获取字段信息 141
5.2 伪共享 145
5.3 字段的内存布局 148
5.3.1 静态字段内存块的偏移量 148
5.3.2 非静态字段内存块的偏移量 149
5.3.3 计算每个字段的偏移量 154
5.3.4 @Contended字段的偏移量 156
5.4 字段的注入 158
5.5 对象类型字段的遍历 165
第6章 方法的解析 174
6.1 Method与ConstMethod类 174
6.1.1 Method类 174
6.1.2 ConstMethod类 177
6.2 调用parse_methods()函数解析方法 178
6.2.1 创建Method与ConstMethod实例 182
6.2.2 保存方法解析信息 187
6.3 klassVtable虚函数表 187
6.3.1 klassVtable类 188
6.3.2 计算vtable的大小 189
6.3.3 vtable的初始化 200
6.4 klassItable虚函数表 209
6.4.1 klassItable类 209
6.4.2 计算itable的大小 211
6.4.3 itable的初始化 213
第7章 类的连接与初始化 220
7.1 类的连接 220
7.2 类的验证 224
7.3 类的重写 227
7.3.1 生成常量池缓存项索引 228
7.3.2 重写字节码指令 234
7.3.3 创建常量池缓存 238
7.4 方法的连接 244
7.5 类的初始化 246
第8章 运行时数据区 250
8.1 HotSpot VM的内存划分 250
8.2 元空间 252
8.2.1 元空间的数据结构 253
8.2.2 内存块的管理 256
8.2.3 内存分配 258
8.2.4 内存回收 262
8.3 堆空间 267
8.3.1 CollectedHeap、Generation与Space类 268
8.3.2 Java堆的回收策略 277
8.3.3 Java堆的初始化 288
第9章 类对象的创建 299
9.1 对象的创建 299
9.2 对象的内存分配 311
9.2.1 在TLAB中分配内存 311
9.2.2 在堆中分配内存 322
9.2.3 添加对象偏移表记录 335
第10章 垃圾回收 344
10.1 分代垃圾回收 344
10.1.1 Serial和Serial Old垃圾收集器 344
10.1.2 复制算法和“标记-整理”算法 346
10.1.3 卡表 352
10.2 垃圾回收线程 358
10.3 安全点 370
10.3.1 关于安全点 370
10.3.2 阻塞线程和状态切换线程进入安全点 376
10.3.3 解释线程进入安全点 379
10.3.4 编译线程进入安全点 383
10.3.5 执行本地代码线程进入安全点 385
第11章 Serial垃圾收集器 388
11.1 触发YGC 388
11.2 年轻代的垃圾回收 389
11.3 标记普通的根对象 403
11.4 标记老年代引用的对象 415
11.5 递归标记活跃对象并复制 422
第12章 Serial Old垃圾收集器 428
12.1 触发FGC 428
12.2 标记活跃对象 431
12.3 计算活跃对象的地址 440
12.4 更新对象的引用地址 451
12.5 移动所有活跃对象 457
12.6 更新偏移表与卡表 460
第13章 Java引用类型 463
13.1 Java引用类型简介 463
13.2 查找引用类型 469
13.3 软引用 481
13.4 弱引用 490
13.5 虚引用 492
13.6 终引用 495
……
第1章 认识HotSpot VM 1
1.1 初识JVM 1
1.2 编译OpenJDK 8 3
1.2.1 准备编译环境 3
1.2.2 下载源代码 3
1.2.3 编译源代码 4
1.2.4 通过GDB调试源代码 6
1.2.5 通过Eclipse调试源代码 7
1.3 HotSpot VM源代码结构 9
1.4 启动HotSpot VM 11
第2章 二分模型 17
2.1 Java类的表示——Klass 17
2.1.1 Klass类 18
2.1.2 InstanceKlass类 26
2.1.3 InstanceKlass类的子类 29
2.1.4 ArrayKlass类 34
2.1.5 TypeArrayKlass类 35
2.1.6 ObjArrayKlass类 40
2.2 Java对象的表示——oop 46
2.2.1 oopDesc类 46
2.2.2 markOopDesc类 48
2.2.3 instanceOopDesc类 49
2.2.4 arrayOopDesc类 51
2.2.5 arrayOopDesc类的子类 51
2.3 操作句柄——Handle 54
2.3.1 句柄Handle的定义与创建 55
2.3.2 句柄Handle的释放 57
第3章 类的加载 62
3.1 类加载器 62
3.1.1 引导类加载器/启动类加载器 62
3.1.2 扩展类加载器 64
3.1.3 应用类加载器/系统类加载器 65
3.1.4 构造类加载器实例 65
3.1.5 类的双亲委派机制 68
3.2 预加载类 83
3.2.1 核心类的预加载 83
3.2.2 数组的预加载 87
3.3 Java主类的装载 88
3.4 触发类的装载 94
第4章 类与常量池的解析 97
4.1 类的解析 97
4.1.1 Class文件格式 97
4.1.2 ClassFileParser类简介 98
4.1.3 ClassFileStream类简介 99
4.1.4 解析类文件 102
4.1.5 保存解析结果 109
4.2 常量池的解析 116
4.2.1 ConstantPool类 117
4.2.2 创建ConstantPool实例 117
4.2.3 解析常量池项 122
第5章 字段的解析 136
5.1 字段的解析基础 136
5.1.1 FieldAllocationCount与FieldAllocationType类 136
5.1.2 为字段分配内存空间 139
5.1.3 获取字段信息 141
5.2 伪共享 145
5.3 字段的内存布局 148
5.3.1 静态字段内存块的偏移量 148
5.3.2 非静态字段内存块的偏移量 149
5.3.3 计算每个字段的偏移量 154
5.3.4 @Contended字段的偏移量 156
5.4 字段的注入 158
5.5 对象类型字段的遍历 165
第6章 方法的解析 174
6.1 Method与ConstMethod类 174
6.1.1 Method类 174
6.1.2 ConstMethod类 177
6.2 调用parse_methods()函数解析方法 178
6.2.1 创建Method与ConstMethod实例 182
6.2.2 保存方法解析信息 187
6.3 klassVtable虚函数表 187
6.3.1 klassVtable类 188
6.3.2 计算vtable的大小 189
6.3.3 vtable的初始化 200
6.4 klassItable虚函数表 209
6.4.1 klassItable类 209
6.4.2 计算itable的大小 211
6.4.3 itable的初始化 213
第7章 类的连接与初始化 220
7.1 类的连接 220
7.2 类的验证 224
7.3 类的重写 227
7.3.1 生成常量池缓存项索引 228
7.3.2 重写字节码指令 234
7.3.3 创建常量池缓存 238
7.4 方法的连接 244
7.5 类的初始化 246
第8章 运行时数据区 250
8.1 HotSpot VM的内存划分 250
8.2 元空间 252
8.2.1 元空间的数据结构 253
8.2.2 内存块的管理 256
8.2.3 内存分配 258
8.2.4 内存回收 262
8.3 堆空间 267
8.3.1 CollectedHeap、Generation与Space类 268
8.3.2 Java堆的回收策略 277
8.3.3 Java堆的初始化 288
第9章 类对象的创建 299
9.1 对象的创建 299
9.2 对象的内存分配 311
9.2.1 在TLAB中分配内存 311
9.2.2 在堆中分配内存 322
9.2.3 添加对象偏移表记录 335
第10章 垃圾回收 344
10.1 分代垃圾回收 344
10.1.1 Serial和Serial Old垃圾收集器 344
10.1.2 复制算法和“标记-整理”算法 346
10.1.3 卡表 352
10.2 垃圾回收线程 358
10.3 安全点 370
10.3.1 关于安全点 370
10.3.2 阻塞线程和状态切换线程进入安全点 376
10.3.3 解释线程进入安全点 379
10.3.4 编译线程进入安全点 383
10.3.5 执行本地代码线程进入安全点 385
第11章 Serial垃圾收集器 388
11.1 触发YGC 388
11.2 年轻代的垃圾回收 389
11.3 标记普通的根对象 403
11.4 标记老年代引用的对象 415
11.5 递归标记活跃对象并复制 422
第12章 Serial Old垃圾收集器 428
12.1 触发FGC 428
12.2 标记活跃对象 431
12.3 计算活跃对象的地址 440
12.4 更新对象的引用地址 451
12.5 移动所有活跃对象 457
12.6 更新偏移表与卡表 460
第13章 Java引用类型 463
13.1 Java引用类型简介 463
13.2 查找引用类型 469
13.3 软引用 481
13.4 弱引用 490
13.5 虚引用 492
13.6 终引用 495
……
猜您喜欢