第1章 初识HotSpot 1
1.1 JDK概述 2
1.1.1 JCP与JSR 3
1.1.2 JDK的发展历程 4
1.1.3 Java 7的语法变化 7
1.2动手编译虚拟机 13
1.2.1源代码下载 13
1.2.2 HotSpot 源代码结构 13
1.2.3搭建编译环境 15
1.2.4编译目标 16
1.2.5编译过程 17
1.2.6编译常见问题 19
1.3实战:在HotSpot内调试HelloWorld 20
1.3.1认识GDB 21
1.3.2准备调试脚本 22
1.4小结 26
第2章 启动 28
2.1 HotSpot内核 28
2.1.1如何阅读源代码 28
2.1.2 HotSpot内核框架 36
2.1.3 Prims 37
2.1.4 Services 39
2.1.5 Runtime 43
2.2启动 46
2.2.1 Launcher 46
2.2.2虚拟机生命周期 48
2.2.3入口:main函数 50
2.2.4主线程 51
2.2.5 InitializeJVM函数 53
2.2.6 JNI CreateJavaVM函数 55
2.2.7调用Java主方法 56
2.2.8 JVM退出路径 56
2.3系统初始化 57
2.3.1配置OS模块 58
2.3.2配置系统属性 60
2.3.3加载系统库 61
2.3.4启动线程 62
2.3.5 vm init_globals函数:初始化全局数据结构 65
2.3.6 init_globals函数:初始化全局模块 65
2.4小结 69
第3章 类与对象 70
3.1对象表示机制 71
3.1.1 OOP-Klass二分模型 71
3.1.2 Oops模块 71
3.1.3 OOP框架与对象访问机制 73
3.1.4 Klass与instanceKlass 79
3.1.5实战:用HSDB调试HotSpot 82
3.2类的状态转换 87
3.2.1入口:Class文件 87
3.2.2类的状态 92
3.2.3加载 96
3.2.4链接 101
3.2.5初始化 104
3.2.6实战:类的“族谱” 107
3.2.7实战:系统字典 111
3.3创建对象 113
3.3.1实例对象的创建流程 114
3.3.2实战:探测JVM内部对象 116
3.4小结 119
第4章 运行时数据区 120
4.1堆 121
4.1.1 Java的自动内存管理 121
4.1.2堆的管理 122
4.2线程私有区域 125
4.2.1 PC 125
4.2.2 JVM栈 126
4.3方法区 126
4.3.1纽带作用 127
4.3.2常量池 130
4.3.3常量池缓存:ConstantPoolCache 133
4.3.4方法的表示:methodoop 134
4.3.5方法的解析:将符号引用转换成直接引用 138
4.3.6代码放在哪里:ConstMethodOop 141
4.3.7实战:探测运行时常量池 142
4.4性能监控数据区:Perf Data 147
4.4.1描述这段空间:PerfMemory 147
4.4.2查看 148
4.4.3生产 150
4.5转储 151
4.5.1用VisualVM进行转储分析 151
4.5.2 JVM Crash 153
4.6小结 158
第5章 垃圾收集 159
5.1堆与GC 160
5.1.1垃圾收集 160
5.1.2分代收集 162
5.1.3快速分配 165
5.1.4栈上分配和逸出分析 167
5.1.5 GC公共模块 167
5.2垃圾收集器 170
5.2.1设计演进 170
5.2.2 CMS收集器 175
5.2.3 G1收集器 180
5.3实战:性能分析方法 184
5.3.1获取GC日志 184
5.3.2 GC监控信息 187
5.3.3内存分析工具 189
5.3.4选择合适的收集器与GC性能评估 190
5.3.5不要忽略JVM Crash日志 195
5.4小结 196
第6章栈 197
6.1硬件背景:了解真实机器 198
6.1.1程序是如何运行的 198
6.1.2 x86与栈帧 199
6.1.3 ARM对Java硬件级加速:Jazelle技术 202
6.2 Java栈 203
6.2.1寄存器式指令集与栈式指令集 203
6.2.2 HotSpot中的栈 204
6.2.3栈帧 207
6.2.4充分利用寄存器资源 210
6.2.5虚拟机如何调用 Java函数 212
6.2.6优化:栈顶缓存 221
6.2.7实战:操作数栈 223
6.3小结 228
第7章 解释器和即时编译器 229
7.1概述 230
7.2解释器如何工作 231
7.2.1 Interpreter模块 232
7.2.2 Code模块 234
7.2.3字节码表 235
7.2.4 Code Cache 236
7.2.5 InterpreterCodelet与Stub队列 239
7.2.6 Code生成器 241
7.2.7模板表与转发表 244
7.2.8实战:InterpreterCodelet 247
7.3即时编译器 250
7.3.1概述 250
7.3.2编译器模块 251
7.3.3编译器的基本结构 252
7.3.4实战:编译原理实践,了解编译中间环节 255
7.4小结 267
第8章 指令集 268
8.1再说栈式指令集 268
8.2数据传送 270
8.2.1局部变量、常量池和操作数栈之间的数据传送 270
8.2.2数据传送指令 272
8.2.3实战:数组的越界检查 277
8.3类型转换 279
8.4对象的创建和操作 281
8.5程序流程控制 282
8.5.1控制转移指令 282
8.5.2条件转移 283
8.5.3无条件转移 284
8.5.4复合条件转移 285
8.5.5实战:switch语句如何使用String 287
8.6运算 290
8.6.1加法:iadd 290
8.6.2取负:ineg 291
8.7函数的调用和返回 292
8.7.1 Java函数分发机制:VTABLE与ITABLE 293
8.7.2 invoke系列指令 297
8.7.3动态分发:覆盖 299
8.7.4静态分发:重载 302
8.8异常 305
8.8.1异常表 305
8.8.2创建异常 306
8.8.3try-catch 309
8.8.4 finally 311
8.9小结 312
第9章 虚拟机监控工具 313
9.1 Attach机制 314
9.1.1 AttachProvider与VirtualMachine 314
9.1.2命令的下发:executeO 317
9.1.3命令的执行:Attach Listener守护线程 319
9.2查看JVM进程 320
9.2.1用jps查看Java进程 320
9.2.2实战:定制jps,允许查看库路径 323
9.3查看和配置JVM 326
9.3.1用jinfo查看JVM参数配置 326
9.3.2实战:扩展flags选项,允许查看命令行参数 330
9.4堆内存转储工具 332
9.4.1 Heap Dump 332
9.4.2原理 333
9.5堆转储分析 337
9.5.1 Heap Dump分析工具:jhat 337
9.5.2实战:MAT分析过程 340
9.6线程转储分析 343
9.6.1 jstack 343
9.6.2实战:如何分析资源等待 344
9.7小结 347