大厂面试必读,JAVA 进阶神书《深入理解 Java 虚拟机》第三版更新内容全曝光!
这是一部从工作原理和工程实践两个维度深入剖析JVM的著作, 自2011年上市以来,累计印刷超40次,销量超过30万册,大厂面试最佳参考手册,进阶架构师必读、Java优化神书,这些标签成就了它成为原创计算机图书领域不可逾越的丰碑。
第3版在第2版的基础上做了重大修订,内容更丰富、实战性更强:根据新版JDK对内容进行了全方位的修订和升级,围绕新技术和生产实践新增逾10万字,包含近50%的全新内容,并对第2版中含糊、瑕疵和错误内容进行了修正。值得所有Java开发人员一读再读!
全书一共13章,分为五大部分:
第一部分(第1章)走近Java
系统介绍了Java的技术体系、发展历程、虚拟机家族,以及动手编译JDK,了解这部分内容能对学习JVM提供良好的指引。
第二部分(第2~5章)自动内存管理
详细讲解了Java的内存区域与内存溢出、垃圾收集器与内存分配策略、虚拟机性能监控与故障排除等与自动内存管理相关的内容,以及10余个经典的性能优化案例和优化方法;
第三部分(第6~9章)虚拟机执行子系统
深入分析了虚拟机执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎,以及多个类加载及其执行子系统的实战案例;
第四部分(第10~11章)程序编译与代码优化
详细讲解了程序的前、后端编译与优化,包括前端的易用性优化措施,如泛型、主动装箱拆箱、条件编译等的内容的深入分析;以及后端的性能优化措施,如虚拟机的热点探测方法、HotSpot 的即时编译器、提前编译器,以及各种常见的编译期优化技术;
第五部分(第12~13章)高效并发
主要讲解了Java实现高并发的原理,包括Java的内存模型、线程与协程,以及线程安全和锁优化。
全书以实战为导向,通过大量与实际生产环境相结合的案例分析和展示了解决各种Java技术难题的方案和技巧。
第三版更新内容全曝光
本书的第2版成文于2011至2012年间,出版于2013年,撰写时是基于早期版本的JDK 7,彼时正值Oracle全面替代Sun公司领导Java技术发展的起点。经过将近十年的时间,今天JDK版本已经发展到了JDK 12及预览版的JDK 13,整个Java技术体系一改Sun时代的迟缓作风,出现了许多激烈的变革,也涌现了不少令人欣喜的新变化、新风潮。我在撰写本书第3版时,期望能把这些新的变化融合到已有的知识框架中,修改第2版中读者反馈的问题,提升叙述的准确性与可读性,这些期望中的更新使得本书字数从原有的24万增加到35万。因此,在前言部分,笔者针对每章列举出主要更新的内容,以便阅读过第2版的读者可以快速定位,获取到新的知识。当然,如果你尚有余暇,不妨从头阅读一次本书,相信会有与阅读第2版时不一样的体验和收获。
第一部分 走近Java
本书的第一部分为后文的研究和讲解建立了良好的基础。虽然了解Java技术的来龙去脉,以及编译自己的OpenJDK对于读者理解Java虚拟机并不是必须的,但是这些准备过程可以为走近Java技术和Java虚拟机提供良好的引导。第一部分只有第1章:
第1章 介绍了Java技术体系过去、现在的情况以及未来的发展趋势,并在实践中介绍了如何自己编译一个OpenJDK 12。
第3版更新:续写了Java技术发展史,这几年Java世界着实发生了很多值得记录的大事件;完全重写了第2版对未来Java的展望预测,当时畅想的Java新发展新变化全部如约而至,是时候把聚光灯交给下一个十年的Java了;OpenJDK开发、编译也发生过不小的变动,本次更新将OpenJDK编译的版本提升到12。
第二部分 自动内存管理
因为程序员把控制内存的权力交给了Java虚拟机,所以可以在编码的时候享受自动内存管理的诸多优势,不过也正因为这个原因,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会成为一项异常艰难的工作。第二部分包括第2~5章:
第2章 介绍了虚拟机中内存是如何划分的,哪部分区域、什么样的代码和操作可能导致内存溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。
第3版更新:Java运行期数据区域是虚拟机的基础结构,尽管JDK版本在快速发展,这块内容仍然保持了相对的稳定,主要的变化是JDK 8时期的永久代的落幕和元空间的登场;除此以外,本章着重修正了第2版中对Java虚拟机栈描述的含糊与偏差之处,还更新了部分测试代码,避免因JDK版本更迭导致与书中不一样的结果。
第3章 介绍了垃圾收集的算法和HotSpot虚拟机中提供的几款垃圾收集器的特点及运作原理。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则。
第3版更新:由于撰写第2版时JDK 7刚刚发布,G1收集器尚无实践数据可查,书中对此讲述得比较含糊,本次更新完全重写了这部分内容,并重点增加了JDK 11、12中新出现的ZGC和Shenandoah两款低延迟全并发收集器的详细原理解析,这是垃圾收集器未来的发展方向。对其他与收集器相关的更新,如统一收集器接口、Epsilon等也都做了对应介绍。此外,针对HotSpot中收集器实现的几个关键技术点,如解决跨代引用的记忆集与卡表、解决并发标记的增量更新和原始快照算法,还有内存读、写屏障等技术都增加了专门的小节来进行介绍,以便帮读者在后续深入阅读HotSpot设计与源码时打下良好的理论基础。
第4章 介绍了随JDK发布的基础命令行工具与可视化的故障处理工具的使用方法。
第3版更新:Java虚拟机的各种监控、管理等辅助工具的功能日益强大,几乎每个版本在这些工具的数量、功能上都会或多或少有所变化,除了将第2版涉及的工具的变化依照JDK版本进行升级外,本章还新增了对JDK 9中加入的JHSDB的使用讲解,并增加了对JFR和JMC的工作原理和使用方法的介绍,以及对部分JDK外部的工具(如JIT Watch)的简要介绍。
第5章 分享了几个比较有代表性的实际案例,还准备了一个所有开发人员都能“亲身实战”的练习,希望读者能通过实践来获得故障处理和调优的经验。
第3版更新:对案例部分进行了更新和增补,着重补充了与前3章新增内容相对应的问题处理案例。不过对实战部分,软件版本的落后并未影响笔者要表达的内容,原有的实战目前仍具有相同的实战价值,在第3版里笔者也并未刻意将Eclipse和HotSpot升级后重写一次。
第三部分 虚拟机执行子系统
执行子系统是虚拟机中必不可少的组成部分,了解了虚拟机如何执行程序,才能更好地理解怎样才能写出优秀的代码。第三部分包括第6~9章:
第6章 讲解了Class文件结构中的各个组成部分,以及每个部分的定义、数据结构和使用方法,以实战的方式演示了Class的数据是如何存储和访问的。
第3版更新:笔者认为本章内容更适合以“技术手册”的形式存在,即适合查阅多于适合阅读,但因为Class文件格式是虚拟机的基础知识,所以尽管枯燥却无法回避。本次更新将Class文件格式的版本跟进到了JDK 12,《Java虚拟机规范》对Class文件格式进行的增强也会在本章中反映,内容相对琐碎。例如,为了实现JDK 9的Java模块化系统,属性表中新增了Module、ModulePackages、ModuleMain-Class三项新属性,常量池中加入了CONSTANT_Module_info和CONSTANT_Package_info两个常量。为了实现JDK 11新增的嵌套内(Java中的内部类)访问控制的API,属性表中又增加了NestHost和NestMembers两项属性。为进一步加强动态语言支持,CONSTANT_Dynamic_info常量也在JDK 11期间加入常量池……
第7章 介绍了类加载过程的“加载”“验证”“准备”“解析”和“初始化”五个阶段中虚拟机分别进行了哪些动作,还介绍了类加载器的工作原理及其对虚拟机的意义。
第3版更新:随着Class文件格式的发展,类加载的各个过程都发生了一些细节性变动,本章将会按照JDK12版本的《Java虚拟机规范》的标准来同步更新这些内容。此外,在JDK 9时引入了Java模块化系统,这是近年来Java技术的一次重要升级,也是对类加载部分影响巨大的一项变革,在本章将加入专门的小节对其进行讲述。
第8章 分析了虚拟机在执行代码时,如何找到正确的方法、如何执行方法内的字节码,以及执行代码时涉及的内存结构。
第3版更新:本章讲述的是Java虚拟机执行子系统的概念模型,这部分属于相对稳定的内容,变化不大,本次主要更新了Java虚拟机对动态类型语言支持的增强。
第9章 通过几个类加载及执行子系统的案例,介绍了使用类加载器和处理字节码的一些值得欣赏和借鉴的思路,并通过一个实战练习加深读者对前面理论知识的理解。
第3版更新:原有章节所涉及的案例中,程序、类库、工具的版本已经较为陈旧,本次更新对这些案例涉及的版本进行了升级,以反映在模块化、Lambda表达式、动态语言等新技术出现后它们的相应变化。
第四部分 程序编译与代码优化
Java程序从源码编译成字节码,再从字节码编译成本地机器码的这两个过程,从整体来看其实等同于一个传统编译器所执行的编译前端、后端过程。第四部分包括第10~11章:
第10章 分析了Java语言中泛型、主动装箱拆箱、条件编译等多种语法糖的前因后果,并实战练习了如何使用插入式注解处理器来完成一个检查程序命名规范的编译器插件。
第3版更新:对第2版介绍泛型的小节进行了全文重写,描述了不同语言里泛型实现的方式、Java泛型出现的历史背景和使用类型擦除来实现泛型所带来的一些限制,并介绍了未来可能会在Java中出现的值类型等内容。
第11章 讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析即时编译的数据和结果,还选择了几种常见的编译期优化技术进行讲解。
第3版更新:专门增加了介绍提前编译器的章节;由于HotSpot中新的Graal编译器的加入,书中除了同步增加Graal编译器、JVMCI接口等内容,为了使读者可以在HotSpot编译器上进行实战练习,在本书第3版中还新增了许多编译器的实战内容。
第五部分 高效并发
Java语言和虚拟机提供了原生的、完善的多线程支持,使得它天生就适合开发多线程并发的应用程序。不过我们不能期望系统来完成所有与并发相关的处理,了解并发的内幕也是成为一位高级程序员不可缺少的课程。第五部分包括第12~13章:
第12章 讲解了虚拟机Java内存模型的结构及操作,以及原子性、可见性和有序性在Java内存模型中的体现;介绍了先行发生原则的规则及使用,以及线程在Java语言之中是如何实现的;还提前介绍了目前仍然在实验室状态的Java协程的相关内容。
第3版更新:重写了原有的对Java内存模型部分过时和过于晦涩的描述,增加了面向Java未来基于协程的新并发模型的介绍。
第13章 介绍了线程安全所涉及的概念和分类、同步实现的方式及虚拟机的底层运作原理,并且介绍了虚拟机实现高效并发所做的一系列锁优化措施。
第3版更新:本章主体内容并没有过多变化,但对不少细节进行了修饰,对一些读者疑问较多的地方进行了补充讲解。
评论