深入理解Java虚拟机(第3版)

深入理解Java虚拟机(第3版):JVM高级特性与最佳实践

编辑推荐

适读人群 :1.使用Java技术体系的中-高级开发人员 2.系统调优师 3.平台架构师 4.准备进互联网大厂面试的Java开发人员

(1)涵盖绝大部分互联网大厂面试知识点!助你顺利进大厂!

(2)根据JDK12和JDK 13 EA版本全面更新,新增内容近50%,并对第2版中含糊、瑕疵和错误内容进行了修正。

(3)计算机图书领域的丰碑,累计印刷超40次,销量超过30万册,两家网店评论数量超过90000条,内容近乎零差评。

(4)从Java技术体系、自动内存管理、虚拟机执行子系统、程序编译与代码优化、高效并发5个维度全面分析JVM。

(5)全书以实战为导向,通过大量与实际生产环境相结合的案例分析和展示了解决各种Java技术难题的方案和技巧。

(6)来自阿里、腾讯、微软、百度、滴滴、易宝支付、同盾科技、达观数据、易观国际、蘑菇街的10位专家高度评价并强烈推荐。

(7)这本书值得所有Java技术人员读3遍,值得Java技术人员读3遍,值得读3遍!

内容简介

这是一部从工作原理和工程实践两个维度深入剖析JVM的著作,是计算机领域公认的经典,繁体版在中国台湾地区也颇受欢迎。

自2011年上市以来,累计印刷超40次,销量超过30万册,两家主要网络书店的评论近90000条,内容上近乎零差评,是原创计算机图书领域不可逾越的丰碑。

第3版在第2版的基础上做了重大修订,内容更丰富、实战性更强:根据新版JDK对内容进行了全方位的修订和升级,围绕新技术和生产实践新增逾10万字,包含近50%的全新内容,并对第2版中含糊、瑕疵和错误内容进行了修正。涵盖互联网大厂面试重要知识点!

全书一共13章,分为五大部分:

●第①部分(第1章)走近Java

系统介绍了Java的技术体系、发展历程、虚拟机家族,以及动手编译JDK,了解这部分内容能对学习JVM提供良好的指引。

●第②部分(第2~5章)自动内存管理

详细讲解了Java的内存区域与内存溢出、垃圾收集器与内存分配策略、虚拟机性能监控与故障排除等与自动内存管理相关的内容,以及10余个经典的性能优化案例和优化方法;

●第③部分(第6~9章)虚拟机执行子系统

深入分析了虚拟机执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎,以及多个类加载及其执行子系统的实战案例;

●第④部分(第10~11章)程序编译与代码优化

详细讲解了程序的前、后端编译与优化,包括前端的易用性优化措施,如泛型、主动装箱拆箱、条件编译等的内容的深入分析;以及后端的性能优化措施,如虚拟机的热点探测方法、HotSpot 的即时编译器、提前编译器,以及各种常见的编译期优化技术;

●第⑤部分(第12~13章)高效并发

主要讲解了Java实现高并发的原理,包括Java的内存模型、线程与协程,以及线程安全和锁优化。

全书以实战为导向,通过大量与实际生产环境相结合的案例分析和展示了解决各种Java技术难题的方案和技巧。

作者简介

周志明(博士)

资深Java技术专家-机器学习技术专家和企业级开发技术专家,现任远光软件研究院院长。

开源技术的积极倡导者和推动者,对计算机科学相关的多个领域都有深刻的见解,尤其是人工智能-Java技术和敏捷开发等,对虚拟机技术有非常深入的研究。

撰写了《深入理解Java虚拟机》《深入理解OSGi》《智慧的疆界》等多本著作,翻译了《Java虚拟机规范》等著作。其中《深入理解Java虚拟机》已累计印刷逾40次,总销超过30万册,成为原创计算机专业图书领域难以逾越的丰碑。

章节目录

【第一部分 走近Java】

●第1章 走近Java2

1.1 概述2

1.2 Java技术体系3

1.3 Java发展史4

1.4 Java虚拟机家族12

1.4.1 虚拟机始祖:Sun Classic/Exact VM12

1.4.2 武林盟主:HotSpot VM13

1.4.3 小家碧玉:Mobile/Embedded VM14

1.4.4 天下第二:BEA JRockit/IBM J9 VM15

1.4.5 软硬合璧:BEA Liquid VM/Azul VM16

1.4.6 挑战者:Apache Harmony/Google Android Dalvik VM17

1.4.7 没有成功,但并非失败:Microsoft JVM及其他18

1.4.8 百家争鸣19

1.5 展望Java技术的未来21

1.5.1 无语言倾向21

1.5.2 新一代即时编译器23

1.5.3 向Native迈进24

1.5.4 灵活的胖子26

1.5.5 语言语法持续增强27

1.6 实战:自己编译JDK29

1.6.1 获取源码29

1.6.2 系统需求31

1.6.3 构建编译环境33

1.6.4 进行编译34

1.6.5 在IDE工具中进行源码调试36

1.7 本章小结39

【第二部分 自动内存管理】

●第2章 Java内存区域与内存溢出异常42

2.1 概述42

2.2 运行时数据区域42

2.2.1 程序计数器43

2.2.2 Java虚拟机栈43

2.2.3 本地方法栈44

2.2.4 Java堆44

2.2.5 方法区46

2.2.6 运行时常量池47

2.2.7 直接内存47

2.3 HotSpot虚拟机对象探秘48

2.3.1 对象的创建48

2.3.2 对象的内存布局51

2.3.3 对象的访问定位52

2.4 实战:OutOfMemoryError异常53

2.4.1 Java堆溢出54

2.4.2 虚拟机栈和本地方法栈溢出56

2.4.3 方法区和运行时常量池溢出61

2.4.4 本机直接内存溢出65

2.5 本章小结66

●第3章 垃圾收集器与内存分配策略67

3.1 概述67

3.2 对象已死?68

3.2.1 引用计数算法68

3.2.2 可达性分析算法70

3.2.3 再谈引用71

3.2.4 生存还是死亡?72

3.2.5 回收方法区74

3.3 垃圾收集算法75

3.3.1 分代收集理论75

3.3.2 标记-清除算法77

3.3.3 标记-复制算法78

3.3.4 标记-整理算法79

3.4 HotSpot的算法细节实现81

3.4.1 根节点枚举81

3.4.2 安全点82

3.4.3 安全区域83

3.4.4 记忆集与卡表84

3.4.5 写屏障85

3.4.6 并发的可达性分析87

3.5 经典垃圾收集器89

3.5.1 Serial收集器90

3.5.2 ParNew收集器92

3.5.3 Parallel Scavenge收集器93

3.5.4 Serial Old收集器94

3.5.5 Parallel Old收集器95

3.5.6 CMS收集器96

3.5.7 Garbage First收集器98

3.6 低延迟垃圾收集器104

3.6.1 Shenandoah收集器105

3.6.2 ZGC收集器112

3.7 选择合适的垃圾收集器121

3.7.1 Epsilon收集器121

3.7.2 收集器的权衡121

3.7.3 虚拟机及垃圾收集器日志122

3.7.4 垃圾收集器参数总结127

3.8 实战:内存分配与回收策略129

3.8.1 对象优先在Eden分配130

3.8.2 大对象直接进入老年代131

3.8.3 长期存活的对象将进入老年代132

3.8.4 动态对象年龄判定134

3.8.5 空间分配担保135

3.9 本章小结137

●第4章 虚拟机性能监控-故障处理工具138

4.1 概述138

4.2 基础故障处理工具138

4.2.1 jps:虚拟机进程状况工具141

4.2.2 jstat:虚拟机统计信息监视工具142

4.2.3 jinfo:Java配置信息工具143

4.2.4 jmap:Java内存映像工具144

4.2.5 jhat:虚拟机堆转储快照分析工具145

4.2.6 jstack:Java堆栈跟踪工具146

4.2.7 基础工具总结148

4.3 可视化故障处理工具151

4.3.1 JHSDB:基于服务性代理的调试工具152

4.3.2 JConsole:Java监视与管理控制台157

4.3.3 VisualVM:多合-故障处理工具164

4.3.4 Java Mission Control:可持续在线的监控工具171

4.4 HotSpot虚拟机插件及工具175

4.5 本章小结180

●第5章 调优案例分析与实战181

5.1 概述181

5.2 案例分析181

5.2.1 大内存硬件上的程序部署策略182

5.2.2 集群间同步导致的内存溢出184

5.2.3 堆外内存导致的溢出错误185

5.2.4 外部命令导致系统缓慢187

5.2.5 服务器虚拟机进程崩溃187

5.2.6 不恰当数据结构导致内存占用过大188

5.2.7 由Windows虚拟内存导致的长时间停顿189

5.2.8 由安全点导致长时间停顿190

5.3 实战:Eclipse运行速度调优192

5.3.1 调优前的程序运行状态193

5.3.2 升级JDK版本的性能变化及兼容问题196

5.3.3 编译时间和类加载时间的优化200

5.3.4 调整内存设置控制垃圾收集频率203

5.3.5 选择收集器降低延迟206

5.4 本章小结209

【第三部分 虚拟机执行子系统】

●第6章 类文件结构212

6.1 概述212

6.2 无关性的基石212

6.3 Class类文件的结构214

6.3.1 魔数与Class文件的版本215

6.3.2 常量池218

6.3.3 访问标志224

6.3.4 类索引-父类索引与接口索引集合225

6.3.5 字段表集合226

6.3.6 方法表集合229

6.3.7 属性表集合230

6.4 字节码指令简介251

6.4.1 字节码与数据类型251

6.4.2 加载和存储指令253

6.4.3 运算指令254

6.4.4 类型转换指令255

6.4.5 对象创建与访问指令256

6.4.6 操作数栈管理指令256

6.4.7 控制转移指令257

6.4.8 方法调用和返回指令257

6.4.9 异常处理指令258

6.4.10 同步指令258

6.5 公有设计,私有实现259

6.6 Class文件结构的发展260

6.7 本章小结261

第7章 虚拟机类加载机制262

7.1 概述262

7.2 类加载的时机263

7.3 类加载的过程267

7.3.1 加载267

7.3.2 验证268

7.3.3 准备271

7.3.4 解析272

7.3.5 初始化277

7.4 类加载器279

7.4.1 类与类加载器280

7.4.2 双亲委派模型281

7.4.3 破坏双亲委派模型285

7.5 Java模块化系统287

7.5.1 模块的兼容性288

7.5.2 模块化下的类加载器290

7.6 本章小结292

第8章 虚拟机字节码执行引擎293

8.1 概述293

8.2 运行时栈帧结构294

8.2.1 局部变量表294

8.2.2 操作数栈299

8.2.3 动态连接300

8.2.4 方法返回地址300

8.2.5 附加信息301

8.3 方法调用301

8.3.1 解析301

8.3.2 分派303

8.4 动态类型语言支持315

8.4.1 动态类型语言316

8.4.2 Java与动态类型317

8.4.3 java.lang.invoke包318

8.4.4 invokedynamic指令321

8.4.5 实战:掌控方法分派规则324

8.5 基于栈的字节码解释执行引擎326

8.5.1 解释执行327

8.5.2 基于栈的指令集与基于寄存器的指令集328

8.5.3 基于栈的解释器执行过程329

8.6 本章小结334

第9章 类加载及执行子系统的案例与实战335

9.1 概述335

9.2 案例分析335

9.2.1 Tomcat:正统的类加载器架构335

9.2.2 OSGi:灵活的类加载器架构338

9.2.3 字节码生成技术与动态代理的实现341

9.2.4 Backport工具:Java的时光机器345

9.3 实战:自己动手实现远程执行功能348

9.3.1 目标348

9.3.2 思路349

9.3.3 实现350

9.3.4 验证355

9.4 本章小结356

【第四部分 程序编译与代码优化】

●第10章 前端编译与优化358

10.1 概述358

10.2 Javac编译器359

10.2.1 Javac的源码与调试359

10.2.2 解析与填充符号表362

10.2.3 注解处理器363

10.2.4 语义分析与字节码生成364

10.3 Java语法糖的味道367

10.3.1 泛型367

10.3.2 自动装箱-拆箱与遍历循环375

10.3.3 条件编译377

10.4 实战:插入式注解处理器378

10.4.1 实战目标379

10.4.2 代码实现379

10.4.3 运行与测试385

10.4.4 其他应用案例386

10.5 本章小结386

●第11章 后端编译与优化388

11.1 概述388

11.2 即时编译器389

11.2.1 解释器与编译器389

11.2.2 编译对象与触发条件392

11.2.3 编译过程397

11.2.4 实战:查看及分析即时编译结果398

11.3 提前编译器404

11.3.1 提前编译的优劣得失405

11.3.2 实战:Jaotc的提前编译408

11.4 编译器优化技术411

11.4.1 优化技术概览411

11.4.2 方法内联415

11.4.3 逃逸分析417

11.4.4 公共子表达式消除420

11.4.5 数组边界检查消除421

11.5 实战:深入理解Graal编译器423

11.5.1 历史背景423

11.5.2 构建编译调试环境424

11.5.3 JVMCI编译器接口426

11.5.4 代码中间表示429

11.5.5 代码优化与生成432

11.6 本章小结436

【第五部分 高效并发】

●第12章 Java内存模型与线程438

12.1 概述438

12.2 硬件的效率与一致性439

12.3 Java内存模型440

12.3.1 主内存与工作内存441

12.3.2 内存间交互操作442

12.3.3 对于volatile型变量的特殊规则444

12.3.4 针对long和double型变量的特殊规则450

12.3.5 原子性-可见性与有序性450

12.3.6 先行发生原则452

12.4 Java与线程455

12.4.1 线程的实现455

12.4.2 Java线程调度458

12.4.3 状态转换460

12.5 Java与协程461

12.5.1 内核线程的局限461

12.5.2 协程的复苏462

12.5.3 Java的解决方案464

12.6 本章小结465

●第13章 线程安全与锁优化466

13.1 概述466

13.2 线程安全466

13.2.1 Java语言中的线程安全467

13.2.2 线程安全的实现方法471

13.3 锁优化479

13.3.1 自旋锁与自适应自旋479

13.3.2 锁消除480

13.3.3 锁粗化481

13.3.4 轻量级锁481

13.3.5 偏向锁483

13.4 本章小结485

附录A 在Windows系统下编译OpenJDK 6486

附录B 展望Java技术的未来(2013年版)493

附录C 虚拟机字节码指令表499

附录D 对象查询语言(OQL)简介506

附录E JDK历史版本轨迹512

深入理解Java虚拟机(第3版)是2019年由机械工业出版社出版,作者周志明。

得书感谢您对《深入理解Java虚拟机(第3版)》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

你可能喜欢
Java性能权威指南 电子书

对Java7和Java8中影响性能的因素展开了全面深入的介绍,讲解传统上影响应用性能的JVM特征。
R语言编程基础 电子书

《R语言学习手册》:7章全面介绍R语言及Rattle工具,附课后习题。
Spring源码深度解析(第2版) 电子书

一本实践与理论并重、广度与深度兼顾的Spring源码开发指南。
Scala与Clojure函数式编程模式:Java虚拟机高效编程 电子书
大数据技术原理与应用(第2版) 电子书

国内高校大数据课程知名教师倾心之作,带你“零基础”学习大数据。
统计思维:程序员数学之概率统计(第2版) 电子书

本书介绍了如何借助计算而非数学方法,使用Python语言对数据进行统计分析。