首页>参考读物>计算机科学与技术>软件与程序设计

深入剖析Java虚拟机:源码剖析与实例详解(基础卷)
作者 : 马智 著
出版日期 : 2021-08-19
ISBN : 978-7-111-68989-8
定价 : 149.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 512
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书以工业级虚拟机HotSpot的源代码分析为基础,详细介绍了对象的二分模型、类的加载机制、类及常量池的解析、方法及变量解析、对象的创建和初始化、Serial和Serial Old垃圾收集器、Java引用类型等的实现原理,同时对重点源代码的实现进行了详细解读,让读者真正掌握HotSpot虚拟机运行的每个细节。本书共13章,章节的前后顺序基本都是按类的生命周期进行介绍。本书对于HotSpot VM的基础功能模块进行了源码剖析,力求交待清楚每个重要知识点的实现细节和背后的运行原理,同时还会用大量的实例和配图帮助读者更好的理解。

图书特色

编辑推荐:
资深程序员全面、深入剖析工业级虚拟机HotSpot的源码实现
详解Java虚拟机的类的生命周期和垃圾收集器等模块的工作原理
PerfMa CEO寒泉子、Huawei JDK负责人海纳等三位大咖力荐
结合大量实例,全面、细致、深入地介绍HotSpot VM的运行原理
详细介绍如何将HotSpot VM的相关理论知识应用到开发和调优实践中)
帮助读者深入理解HotSpot VM如何支持Java语言的诸多特性
帮助读者应对大型互联网公司招聘时对虚拟机相关知识的深度考查

图书前言

为什么要写这本书
  Java是一门流行多年的高级编程语言,与其相关的就业岗位很多,但是最近几年却出现了用人单位招不到合适的人,而大量Java程序员找不到工作的尴尬局面。究其根本原因是岗位对Java开发技术的要求高,不但要会应用,而且更要懂其内部的运行原理。对于想要深入研究Java技术的从业人员来说,虚拟机是绕不开的话题。目前国内市场上还鲜见一本全面、细致、深入剖析Java虚拟机源码的书籍,这正是本书要填补的市场空白。
  本书围绕Java最流行的HotSpot VM进行源码的深度剖析,主要面向那些想要深入学习和研究Java语言运行原理的人。本书对那些正在从事或将来想要从事虚拟机开发的编程人员也有极大的帮助。另外,对于Java求职人员来说,在参加大型互联网公司的面试时,应对招聘企业对虚拟机相关知识的深度考查已成为不可回避的问题,本书正好能提高他们对虚拟机理解的广度和深度,可谓雪中送炭。
  需要说明的是,HotSpot VM有上百万行的代码,这些代码逻辑严密,细节众多,要想讲解清楚,需要较多的篇幅。为了让读者能够更好地理解其中的要点,笔者决定用两本书的篇幅来介绍HotSpot VM的相关知识。本书为《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》,后续还会推出《深入剖析Java虚拟机:源码剖析与实例详解(运行时卷)》,敬请各位读者关注。笔者会在这两本书中对HoSpot VM的重点源代码展开细致的讲解,同时还会结合大量实例和图示,帮助读者更好地理解所学知识。
本书特色
  1.内容丰富,讲解详细
  本书对对象的二分模型、类的加载机制、类与常量池、方法与变量、对象的创建和初始化、Serial和Serial Old垃圾收集器、Java引用类型等内容进行详细解读,帮读者真正掌握HotSpot VM运行的每个细节。
  2.原理分析与实例并重
  本书对HotSpot VM的各个基础功能模块的重点源代码进行了详细分析,并结合大量实例和图示帮助读者更好地理解所学内容。
  3.分析工业级虚拟机的源码实现
  本书分析的是一个工业级的Java虚拟机HotSpot,它是大部分Java开发人员运行Java项目时使用的虚拟机。对于Java从业人员来说,深入理解HotSpot VM的运行原理,可以帮助他们写出更加高效的Java代码,同时也能更好地排查Java性能瓶颈等一系列问题。
本书内容
  本书深入剖析HotSpot VM的源代码实现,每一章都会对重点源代码的实现进行解读。下面简单介绍一下本书中各章的内容。
  第1章主要介绍本地编译HotSpot VM的具体过程,以及如何使用图形化工具对HotSpot VM的源代码进行调试。
  第2章介绍类的二分模型,其中表示Java类的Klass模型与表示Java对象的oop模型是HotSpot VM的最基础部分。
  第3章介绍类的加载,重点介绍核心类和数组类的加载过程,以及类加载的双亲委派机制。
  第4章对类及常量池进行解析,按照Class文件的格式从Class文件中解析出存储的类及常量池信息,然后映射成HotSpot VM内部的表示形式。
  第5章对字段进行解析,解析出Class文件中保存的字段信息后映射为HotSpot VM内部的表示形式,同时还要对实例字段进行布局。
  第6章对方法进行解析,解析出Class文件中保存的方法信息后映射为HotSpot VM内部的表示形式,并初始化klassVtable与klassItable以更好地支持方法的运行。
  第7章介绍类的连接和初始化过程。
  第8章介绍HotSpot VM的内存划分,重点介绍元空间和堆空间,如元空间的数据结构及其内存分配和释放,以及堆的初始化和回收策略等。
  第9章介绍Java对象的创建过程,重点介绍对象内存分配的具体过程。
  第10章介绍垃圾回收的基础知识,包括垃圾回收算法、支持分代垃圾回收的卡表和偏移表、支持垃圾回收的安全点。
  第11章介绍用于回收年轻代的Serial垃圾收集器。
  第12章介绍用于回收老年代的Serial Old垃圾收集器。
  第13章介绍Java引用类型,包括引用类型的查找及不同类型引用对象的回收处理逻辑。
本书读者对象
  阅读本书需要读者有一定的编程经验,尤其要对Java语言有一定的了解。具体而言,本书主要适合以下读者阅读:
* 想深入学习Java语言特性的Java从业人员;
* 想全面、深入理解HotSpot VM原理的人员;
* 从事虚拟机开发的人员;
* 对大型工程的源代码感兴趣的人员,尤其是对C++语言工程实践感兴趣的人员。
本书阅读建议
  本书的内容循序渐进,建议读者按照章节的排列顺序进行阅读,同时在阅读每一章的过程中对书中给出的实例进行实践,以便更好地理解所讲的内容。
  HotSpot VM有上百万行的源代码,并且代码的逻辑密度非常大。读者阅读相关的源代码时,不要过分纠结于每个实现细节,否则会陷入细节的“汪洋大海”中。本书对HotSpot VM的重点源代码进行了解读,读者可以参考书中对这些重点源代码的讲解进行学习和调试。
  另外,要深入理解Java的运行原理,需要读者对Java编译器有所了解。想要全面、深入地学习Java编译器的相关知识,推荐读者阅读笔者的拙作《深入解析Java编译器:源码剖析与实例详解》一书。该书出版后得到了广大Java技术爱好者的好评,是深入学习Java主流编译器Javac运行原理的理想选择。
本书配套资源
  本书涉及的HotSpot VM源代码已经开源,读者可以通过多种途径获取。笔者推荐的下载网址为https://download.java.net/openjdk/jdk8。
读者反馈
  由于笔者水平所限,书中可能还存在一些疏漏,敬请读者指正,笔者会及时进行调整和修改。联系邮箱:mazhimazh@126.com或hzbook2017@163.com。
致谢
  本书的写作得到很多朋友和同事的帮助与支持,笔者在此表示由衷的感谢!
  感谢欧振旭编辑在本书出版过程中给予笔者的大力支持与帮助!
  最后感谢家人对我的理解与支持,在我遇到挫折和问题时,家人坚定地支持着我。爱你们!

马智

上架指导

计算机\程序设计

封底文字

本书赞誉
本书对Java虚拟机HotSpot的源码做了全面、细致的剖析,强烈推荐Java虚拟机知识薄弱的开发者仔细研读。这将是一个好的开端,因为它能带领你快速进入虚拟机的世界,让你系统了解虚拟机复杂的工作原理及其相关技术细节。
——PerfMa CEO 寒泉子

本书以通俗易懂的语言详细介绍Java虚拟机HotSpot的源码实现,可以帮助读者系统掌握类的生命周期和垃圾回收等基本组件的相关知识。对于想全面了解HotSpot虚拟机工作原理和源码实现的广大Java程序员来说,本书可谓雪中送炭,值得细读。
——Huawei JDK负责人/华为编译器高级技术专家 海纳

本书着重于Java虚拟机HotSpot的源码分析。开篇先从源码的构建开始讲解,然后逐步深入介绍HotSpot的类的加载机制、对象的二分模型和Serial垃圾收集器等相关知识。本书内容丰富,讲解循序渐进,除了翔实的源码剖析外,还结合大量图示和实例帮助读者深入理解相关知识,对于那些对Java虚拟机底层技术感兴趣的开发人员有较高的参考价值。
——阿里云JVM研发工程师/OpenJDK Committer 杨易
源代码获取方式
本书涉及的HotSpot VM源码已经开源,读者可以通过https://download.java.net/openjdk/jdk8网站获取,也可以通过其他多种途径获取。

作者简介

马智 著:本书特色
结合大量实例,全面、细致、深入地介绍HotSpot VM的运行原理;
详细介绍如何将HotSpot VM的相关理论知识应用到开发和调优实践中;
帮助读者深入理解HotSpot VM如何支持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

教学资源推荐
作者: 邱李华,曹青,郭志强
作者: [美]沃特·萨维奇 (Walter Savitch) 肯里克·莫克(Kenrick Mock)著
作者: [美] 托尼·加迪斯(Tony Gaddis) 著
参考读物推荐
作者: 廖世恩 许宏送
作者: 郑海生
作者: (美) Piero Giacomelli 著