内容简介
本书以工业级虚拟机HotSpot的源代码分析为基础,详细介绍了对象的二分模型、类的加载机制、类及常量池的解析、方法及变量解析、对象的创建和初始化、Serial和Serial Old垃圾收集器、Java引用类型等的实现原理,同时对源代码的实行了详细解读,让读者真正掌握HotSpot虚拟机运行的每个细节。本书共13章,章节的前后顺序基本都是按类的生命周行介绍。本书对于HotSpot VM的基能模行了源码剖析,力求交待清楚每个重要知识点的实现细节和背后的运行原理,同时还会用大量的实例和配图帮助读者更好的理解。
目录
前言第1章 认识HotSpot VM 11.1 初识JVM 11.2 编译OpenK 8 31.2.1 准备编译环境 31.2.2 下载源代码 31.2.3 编译源代码 41.2.4 通过GDB调试源代码 61.2.5 通过Eclipse调试源代码 71.3 HotSpot VM源代码结构 91.4 启动HotSpot VM 11第2章 二分模型 172.1 Java类的表示——Klass 172.1.1 Klass类 182.1.2 InstanceKlass类 262.1.3 InstanceKlass类的子类 292.1.4 ArrayKlass类 342.1.5 TypeArrayKlass类 352.1.6 ObjArrayKlass类 402.2 Java对象的表示——oop 462.2.1 oopDesc类 462.2.2 markOopDesc类 482.2.3 instanceOopDesc类 492.2.4 arrayOopDesc类 512.2.5 arrayOopDesc类的子类 512.3 操作句柄——Handle 542.3.1 句柄Handle的定义与创建 552.3.2 句柄Handle的释放 57第3章 类的加载 623.1 类加载器 623.1.1 引导类加载器/启动类加载器 623.1.2 扩展类加载器 643.1.3 应用类加载器/系统类加载器 653.1.4 构造类加载器实例 653.1.5 类的双亲委派机制 683.2 预加载类 833.2.1 核心类的预加载 833.2.2 数组的预加载 873.3 Java主类的装载 883.4 触发类的装载 94第4章 类与常量池的解析 974.1 类的解析 974.1.1 Class文件格式 974.1.2 ClassFileParser类简介 984.1.3 ClassFileStream类简介 994.1.4 解析类文件 1024.1.5 保存解析结果 1094.2 常量池的解析 1164.2.1 ConstantPool类 1174.2.2 创建ConstantPool实例 1174.2.3 解析常量池项 122第5章 字段的解析 1365.1 字段的解析基础 1365.1.1 FieldAllocationCount与FieldAllocationType类 1365.1.2 为字段分配内存空间 1395.1.3 获取字段信息 1415.2 伪共享 1455.3 字段的内存布局 1485.3.1 静态字段内存块的偏移量 1485.3.2 非静态字段内存块的偏移量 1495.3.3 计算每个字段的偏移量 1545.3.4 @Contended字段的偏移量 1565.4 字段的注入 1585.5 对象类型字段的遍历 165第6章 方法的解析 1746.1 Method与ConstMethod类 1746.1.1 Method类 1746.1.2 ConstMethod类 1776.2 调用parse_methods()函数解析方法 1786.2.1 创建Method与ConstMethod实例 1826.2.2 保存方法解析信息 1876.3 klassVtable虚函数表 1876.3.1 klassVtable类 1886.3.2 计算vtable的大小 1896.3.3 vtable的初始化 2006.4 klassItable虚函数表 2096.4.1 klassItable类 2096.4.2 计算itable的大小 2116.4.3 itable的初始化 213第7章 类的连接与初始化 2207.1 类的连接 2207.2 类的验证 2247.3 类的重写 2277.3.1 生成常量池缓存项索引 2287.3.2 重写字节码指令 2347.3.3 创建常量池缓存 2387.4 方法的连接 2447.5 类的初始化 246第8章 运行时数据区 2508.1 HotSpot VM的内存划分 2508.2 元空间 2528.2.1 元空间的数据结构 2538.2.2 内存块的管理 2568.2.3 内存分配 2588.2.4 内存回收 2628.3 堆空间 2678.3.1 CollectedHeap、Generation与Space类 2688.3.2 Java堆的回收策略 2778.3.3 Java堆的初始化 288第9章 类对象的创建 2999.1 对象的创建 2999.2 对象的内存分配 3119.2.1 在TLAB中分配内存 3119.2.2 在堆中分配内存 3229.2.3 添加对象偏移表记录 335第10章 垃圾回收 34410.1 分代垃圾回收 34410.1.1 Serial和Serial Old垃圾收集器 34410.1.2 算法和“标记-整理”算法 34610.1.3 卡表 35210.2 垃圾回收线程 35810.3 点 37010.3.1 关于点 37010.3.2 阻塞线程和状态切换线入点 37610.3.3 解释线入点 37910.3.4 编译线入点 38310.3.5 执行本地代码线入点 385第11章 Serial垃圾收集器 38811.1 触发YGC 38811.2 年轻代的垃圾回收 38911.3 标记普通的根对象 40311.4 标记老年代引用的对象 41511.5 递归标记活跃对象并 422第12章 Serial Old垃圾收集器 42812.1 触发FGC 42812.2 标记活跃对象 43112.3 计算活跃对象的地址 44012.4 更新对象的引用地址 45112.5 移动所有活跃对象 45712.6 更新偏移表与卡表 460第13章 Java引用类型 46313.1 Java引用类型简介 46313.2 查找引用类型 46913.3 软引用 48113.4 弱引用 49013.5 虚引用 49213.6 终引用 495


