本书第1版两年内印刷近10次,4家网上书店的评论近4000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。
全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。
封面图
目录
- 前言
- 第一部分走近Java
- 第1章走近Java / 2
- 1.1概述 / 2
- 1.2Java技术体系 / 3
- 1.3Java发展史 / 5
- 1.4Java虚拟机发展史 / 9
- 1.4.1Sun Classic / Exact VM / 9
- 1.4.2Sun HotSpot VM / 11
- 1.4.3Sun Mobile-Embedded VM / Meta-Circular VM / 12
- 1.4.4BEA JRockit / IBM J9 VM / 13
- 1.4.5Azul VM / BEA Liquid VM / 14
- 1.4.6Apache Harmony / Google Android Dalvik VM / 14
- 1.4.7Microsoft JVM及其他 / 15
- 1.5展望Java技术的未来 / 16
- 1.5.1模块化 / 17
- 1.5.2混合语言 / 17
- 1.5.3多核并行 / 19
- 1.5.4进一步丰富语法 / 20
- 1.5.564位虚拟机 / 21
- 1.6实战:自己编译JDK / 22
- 1.6.1获取JDK源码 / 22
- 1.6.2系统需求 / 24
- 1.6.3构建编译环境 / 25
- 1.6.4进行编译 / 26
- 1.6.5在IDE工具中进行源码调试 / 31
- 1.7本章小结 / 35
- 第二部分自动内存管理机制
- 第2章Java内存区域与内存溢出异常 / 38
- 2.1概述 / 38
- 2.2运行时数据区域 / 38
- 2.2.1程序计数器 / 39
- 2.2.2Java虚拟机栈 / 39
- 2.2.3本地方法栈 / 40
- 2.2.4Java堆 / 41
- 2.2.5方法区 / 41
- 2.2.6运行时常量池 / 42
- 2.2.7直接内存 / 43
- 2.3HotSpot虚拟机对象探秘 / 43
- 2.3.1对象的创建/ 44
- 2.3.2对象的内存布局/ 47
- 2.3.3对象的访问定位/ 48
- 2.4实战:OutOfMemoryError异常 / 50
- 2.4.1Java堆溢出 / 51
- 2.4.2虚拟机栈和本地方法栈溢出 / 53
- 2.4.3方法区和运行时常量池溢出 / 56
- 2.4.4本机直接内存溢出 / 59
- 2.5本章小结 / 60
- 第3章垃圾收集器与内存分配策略 / 61
- 3.1概述 / 61
- 3.2对象已死吗 / 62
- 3.2.1引用计数算法 / 62
- 3.2.2可达性分析算法 / 64
- 3.2.3再谈引用 / 65
- 3.2.4生存还是死亡 / 66
- 3.2.5回收方法区 / 68
- 3.3垃圾收集算法 / 69
- 3.3.1标记-清除算法 / 69
- 3.3.2复制算法 / 70
- 3.3.3标记-整理算法 / 71
- 3.3.4分代收集算法 / 72
- 3.4HotSpot的算法实现 / 72
- 3.4.1枚举根节点 / 72
- 3.4.2安全点 / 73
- 3.4.3安全区域 / 74
- 3.5垃圾收集器 / 75
- 3.5.1Serial收集器 / 76
- 3.5.2ParNew收集器 / 77
- 3.5.3Parallel Scavenge收集器 / 79
- 3.5.4Serial Old收集器 / 80
- 3.5.5Parallel Old收集器 / 80
- 3.5.6CMS收集器 / 81
- 3.5.7G1收集器 / 84
- 3.5.8理解GC日志 / 89
- 3.5.9垃圾收集器参数总结 / 90
- 3.6内存分配与回收策略 / 91
- 3.6.1对象优先在Eden分配 / 91
- 3.6.2大对象直接进入老年代 / 93
- 3.6.3长期存活的对象将进入老年代 / 95
- 3.6.4动态对象年龄判定 / 97
- 3.6.5空间分配担保 / 98
- 3.7本章小结 / 100
- 第4章虚拟机性能监控与故障处理工具 / 101
- 4.1概述 / 101
- 4.2JDK的命令行工具 / 101
- 4.2.1jps:虚拟机进程状况工具 / 104
- 4.2.2jstat:虚拟机统计信息监视工具 / 105
- 4.2.3jinfo:Java配置信息工具 / 106
- 4.2.4jmap:Java内存映像工具 / 107
- 4.2.5jhat:虚拟机堆转储快照分析工具 / 108
- 4.2.6jstack:Java堆栈跟踪工具 / 109
- 4.2.7HSDIS:JIT生成代码反汇编 / 111
- 4.3JDK的可视化工具 / 114
- 4.3.1JConsole:Java监视与管理控制台 / 115
- 4.3.2VisualVM:多合一故障处理工具 / 122
- 4.4本章小结 / 131
- 第5章调优案例分析与实战 / 132
- 5.1概述 / 132
- 5.2案例分析 / 132
- 5.2.1高性能硬件上的程序部署策略 / 132
- 5.2.2集群间同步导致的内存溢出 / 135
- 5.2.3堆外内存导致的溢出错误 / 136
- 5.2.4外部命令导致系统缓慢 / 137
- 5.2.5服务器JVM进程崩溃 / 138
- 5.2.6不恰当数据结构导致内存占用过大 / 139
- 5.2.7由Windows虚拟内存导致的长时间停顿 / 141
- 5.3实战:Eclipse运行速度调优 / 142
- 5.3.1调优前的程序运行状态 / 142
- 5.3.2升级JDK 1.6的性能变化及兼容问题 / 145
- 5.3.3编译时间和类加载时间的优化 / 150
- 5.3.4调整内存设置控制垃圾收集频率 / 153
- 5.3.5选择收集器降低延迟 / 157
- 5.4本章小结 / 160
- 第三部分虚拟机执行子系统
- 第6章类文件结构 / 162
- 6.1概述 / 162
- 6.2无关性的基石 / 162
- 6.3Class类文件的结构 / 164
- 6.3.1魔数与Class文件的版本 / 166
- 6.3.2常量池 / 167
- 6.3.3访问标志 / 173
- 6.3.4类索引、父类索引与接口索引集合 / 174
- 6.3.5字段表集合 / 175
- 6.3.6方法表集合 / 178
- 6.3.7属性表集合 / 180
- 6.4字节码指令简介 / 196
- 6.4.1字节码与数据类型 / 197
- 6.4.2加载和存储指令 / 199
- 6.4.3运算指令 / 200
- 6.4.4类型转换指令 / 202
- 6.4.5对象创建与访问指令 / 203
- 6.4.6操作数栈管理指令 / 203
- 6.4.7控制转移指令 / 204
- 6.4.8方法调用和返回指令 / 204
- 6.4.9异常处理指令 / 205
- 6.4.10同步指令 / 205
- 6.5公有设计和私有实现 / 206
- 6.6Class文件结构的发展 / 207
- 6.7本章小结 / 208
- 第7章虚拟机类加载机制 / 209
- 7.1概述 / 209
- 7.2类加载的时机 / 210
- 7.3类加载的过程 / 214
- 7.3.1加载 / 214
- 7.3.2验证 / 216
- 7.3.3准备 / 219
- 7.3.4解析 / 220
- 7.3.5初始化 / 225
- 7.4类加载器 / 227
- 7.4.1类与类加载器 / 228
- 7.4.2双亲委派模型 / 229
- 7.4.3破坏双亲委派模型 / 233
- 7.5本章小结 / 235
- 第8章虚拟机字节码执行引擎 / 236
- 8.1概述 / 236
- 8.2运行时栈帧结构 / 236
- 8.2.1局部变量表 / 238
- 8.2.2操作数栈 / 242
- 8.2.3动态连接 / 243
- 8.2.4方法返回地址 / 243
- 8.2.5附加信息 / 244
- 8.3方法调用 / 244
- 8.3.1解析 / 244
- 8.3.2分派 / 246
- 8.3.3动态类型语言支持 / 258
- 8.4基于栈的字节码解释执行引擎 / 269
- 8.4.1解释执行 / 269
- 8.4.2基于栈的指令集与基于寄存器的指令集 / 270
- 8.4.3基于栈的解释器执行过程 / 272
- 8.5本章小结 / 275
- 第9章类加载及执行子系统的案例与实战 / 276
- 9.1概述 / 276
- 9.2案例分析 / 276
- 9.2.1Tomcat:正统的类加载器架构 / 276
- 9.2.2OSGi:灵活的类加载器架构 / 279
- 9.2.3字节码生成技术与动态代理的实现 / 282
- 9.2.4Retrotranslator:跨越JDK版本 / 286
- 9.3实战:自己动手实现远程执行功能 / 289
- 9.3.1目标 / 290
- 9.3.2思路 / 290
- 9.3.3实现 / 291
- 9.3.4验证 / 298
- 9.4本章小结 / 299
- 第四部分程序编译与代码优化
- 第10章早期(编译期)优化 / 302
- 10.1概述 / 302
- 10.2Javac编译器 / 303
- 10.2.1Javac的源码与调试 / 303
- 10.2.2解析与填充符号表 / 305
- 10.2.3注解处理器 / 307
- 10.2.4语义分析与字节码生成 / 307
- 10.3Java语法糖的味道 / 311
- 10.3.1泛型与类型擦除 / 311
- 10.3.2自动装箱、拆箱与遍历循环 / 315
- 10.3.3条件编译 / 317
- 10.4实战:插入式注解处理器 / 318
- 10.4.1实战目标 / 318
- 10.4.2代码实现 / 319
- 10.4.3运行与测试 / 326
- 10.4.4其他应用案例 / 327
- 10.5本章小结 / 328
- 第11章晚期(运行期)优化 / 329
- 11.1概述 / 329
- 11.2HotSpot虚拟机内的即时编译器 / 329
- 11.2.1解释器与编译器 / 330
- 11.2.2编译对象与触发条件 / 332
- 11.2.3编译过程 / 337
- 11.2.4查看及分析即时编译结果 / 339
- 11.3编译优化技术 / 345
- 11.3.1优化技术概览 / 346
- 11.3.2公共子表达式消除 / 350
- 11.3.3数组边界检查消除 / 351
- 11.3.4方法内联 / 352
- 11.3.5逃逸分析 / 354
- 11.4Java与C/C++的编译器对比 / 356
- 11.5本章小结 / 358
- 第五部分高效并发
- 第12章Java内存模型与线程 / 360
- 12.1概述 / 360
- 12.2硬件的效率与一致性 / 361
- 12.3Java内存模型 / 362
- 12.3.1主内存与工作内存 / 363
- 12.3.2内存间交互操作 / 364
- 12.3.3对于volatile型变量的特殊规则 / 366
- 12.3.4对于long和double型变量的特殊规则 / 372
- 12.3.5原子性、可见性与有序性 / 373
- 12.3.6先行发生原则 / 375
- 12.4Java与线程 / 378
- 12.4.1线程的实现 / 378
- 12.4.2Java线程调度 / 381
- 12.4.3状态转换 / 383
- 12.5本章小结 / 384
- 第13章线程安全与锁优化 / 385
- 13.1概述 / 385
- 13.2线程安全 / 385
- 13.2.1Java语言中的线程安全 / 386
- 13.2.2线程安全的实现方法 / 390
- 13.3锁优化 / 397
- 13.3.1自旋锁与自适应自旋 / 398
- 13.3.2锁消除 / 398
- 13.3.3锁粗化 / 400
- 13.3.4轻量级锁 / 400
- 13.3.5偏向锁 / 402
- 13.4本章小结 / 403
- 附录
- 附录A编译Windows版的OpenJDK / 406
- 附录B虚拟机字节码指令表 / 414
- 附录CHotSpot虚拟机主要参数表 / 420
- 附录D对象查询语言(OQL)简介 / 424
- 附录EJDK历史版本轨迹 / 430