前言

Java是目前用户最多、使用范围最广的软件开发技术,Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架(如Spring、 MyBatis等) 构成。在国内,有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比而言,有关Java虚拟机的资料却显得异常贫乏。

这种状况很大程度上是由Java开发技术本身的一一个重要优点导致的:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。运行程序的物理机千差万别,而Java虚拟机则在千差万别的物理机上面建立了统一的运行平台,实现了在任意一台Java虚拟机上编译的程序,都能在任何其他Java虚拟机上正常运行。这一极大的优势使得Java应用的开发比传统C/C+ +应用的开发更高效快捷,程序员可以把主要精力放在具体业务逻辑,而不是放在保障物理硬件的兼容性上。通常情况下,一个程序员只要了解了必要的Java类库API、Java语法, 学习适当的第三方开发框架,就已经基本满足日常开发的需要了。虚拟机会在用户不知不觉中完成对硬件平台的兼容及对内存等资源的管理工作。因此,了解虚拟机的运作并不是普通开发人员必备的,或者说首要学习的知识。

其实,目前商用的高性能Java虚拟机都提供了相当多的优化参数和调节手段,用于满足应用程序在实际生产环境中对性能和稳定性的要求。如果只是为了入门学习,让程序在自己的机器上正常工作,那么这些特性可以说是可有可无的;但是,如果用于生产开发,尤其是大规模的、企业级的生产开发,就迫切需要开发人员中至少有一部分 人对虚拟机的特性及调节方法具有很清晰的认识。所以在Java开发体系中,对架构师、系统调优师、高级程序员等角色的需求一直都非常大。

学习虚拟机中各种自动运作特性的原理也成为Java程序员成长路上最终必然会接触到的一课。
通过本文,读者可以以一个相对轻松的方式学到虚拟机的运作原理。

首先先来看目录

 

其次,是主要讲的内容

本文一共分为五个部分:走近Java、自动内存管理、虚拟机执行子系统、程序编译与代码优化、高效并发。

各个部分之间基本上是互相独立的,没有必然的前后依赖关系,读者可以从任何一一个感兴趣的专题开始阅读,但是每个部分各个章节间则有先后顺序。

第一部分走近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运行期数据区域是虚拟机的 基础结构,尽管]DK版本在快速发展,这块内容仍然保持了相对的稳定,主要的变化是JDK 8时期的永久代的落幕和元空间的登场;除此以外,本章着重修正了第2版中对]ava虚拟机栈描述的含糊与偏差之处,还更新了部分测试代码,避免因JDK版本更迭导致与书中不一样的结果。

 

 

第3章介绍了垃圾收集的算法和HotSpot虚拟机中提供的几款垃圾收集器的特点及运作原理。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则。

第3版更新:由于撰写第2版时JDK 7刚刚发布,G1收集器尚无实践数据可查,书中对此讲述得比较含糊,本次更新完全重写了这部分内容,并重点增加了JDK11、12中新出现的ZGC和Shenandoah两款低延迟全并发收集器的详细原理解析,这是垃圾收集器未来的发展方向。对其他与收集器相关的更新,如统一收集器接口、Epsilon等 也都做了对应介绍。此外,针对HotSpot中收集器实现的几个关键技术点,如解决跨代引用的记忆集与卡表、解决并发标记的增量更新和原始快照算法,还有内存读、写屏障等技术都增加了专门的小节来进行介绍,以便帮读者在后续深入阅读HotSpot设计与源码时打下良好的理论基础。

 

 

第4章介绍了随JDK发布的基础命令行工具与可视化的故障处理工具的使用方法。

第3版更新: Java虛 拟机的各种监控、管理等辅助工具的功能日益强大,几乎每个版本在这些工具的数量、功能上都会或多或少有所变化,除了将第2版涉及的工具的变化依照JDK版本进行升级外,本章还新增了对JDK 9中加入的JHSDB的使用讲解,并增加了对JFR和]MC的工作原理和使用方法的介绍,以及对部分JDK外部的工具(如]IT Watch)的简要介绍。

 

第5章分享了 几个比较有代表性的实际案例,还准备了一个所有开发人员都能“亲身实战”的练习,希望读者能通过实践来获得故障处理和调优的经验。

第3版更新:对案例部分进行了更新和增补,着重补充了与前3章新增内容相对应的问题处理案例。不过对实战部分,软件版本的落后并未影响笔者要表达的内容,原有的实战目前仍具有相同的实战价值,在第3版里笔者也并未刻意将Eclipse和HotSpot升级后重写一次。

 

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

执行子系统是虚拟机中必不可少的组成部分,了解了虚拟机如何执行程序,才能更好地理解怎样才能写出优秀的代码。第三部分包括第6~ 9章:

第6章讲解了Class文件结构中的各个组成部分,以及每个部分的定义、数据结构和使用方法,以实战的方式演示了Class的数据是如何存储和访问的。

 

第7章介绍了类加载过程的"加载”"验证” "准备” "解析” 和"初始化"五个阶段中虚拟机分别进行了哪些动作,还介绍了类加载器的工作原理及其对虚拟机的意义。

第3版更新: 随着Class文件格 式的发展,类加载的各个过程都发生了一些细节性变动,本章将会按照JDK 12版本的《Java虚 拟机规范》的标准来同步更新这些内容。此外,在]DK9时引入了Java模块化系统,这是近年来]ava技术的一次重要升级,也是对类加载部分影响巨大的一项变革,在本章将加入专门的小节对其进行讲述。

 

第8章分析了虚拟机在执行代码时,如何找到正确的方法、如何执行方法内的字节码,以及执行代码时涉及的内存结构。

第3版更新:本章讲述的是]ava虚拟机执行子系统的概念模型,这部分属于相对稳定的内容,变化不大,本次主要更新了Java虚拟机对动态类型语言支持的增强。

 

第9章通过几个类加载及 执行子系统的案例,介绍了使用类加载器和处理字节码的一-些值得欣赏和借鉴的思路,并通过一个实战练习加深读者对前面理论知识的理解。

第3版更新: 原有章节所涉及的案例中,程序、类库、工具的版本已经较为陈旧,本次更新对这些案例涉及的版本进行了升级,以反映在模块化、Lambda表达式、动态语言等新技术出现后它们的相应变化。

 

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

Java程序从源码编译成字节码,再从字节码编译成本地机器码的这两个过程,从整体来看其实等同于一个传统编译器所执行的编译前端、后端过程。第四部分包括第10~ 11章:

第10章分析了Java语言中泛型、主动装箱拆箱、条件编译等多种语法糖的前因后果,并实战练习了如何使用插入式注解处理器来完成一个检查程序命名规范的编译器插件。

第3版更新: 对第2版介绍泛型的小节进行了全文重写,描述了不同语言里泛型实现的方式、Java泛型出现的历史背景和使用类型擦除来实现泛型所带来的一些限制,并介绍了未来可能会在]ava中出现的值类型等内容。

 

第11章讲解了虚拟机的热点探测方法、HotSpot的即时编译器、 编译触发条件,以及如何从虚拟机外部观察和分析即时编译的数据和结果,还选择了几种常见的编译期优化技术进行讲解。

第3版更新: 专门增加了介绍提前编译 器的章节;由于HotSpot 中新的Gral编译器的加入,书中除了同步增加Graal编译器、JVMCI接口等内容,为了使读者可以在HotSpot编译器上进行实战练习,在本书第3版中还新增了许多编译器的实战内容。

 

第五部分高效并发

Java语言和虚拟机提供了原生的、完善的多线程支持,使得它天生就适合开发多线程并发的应用程序。不过我们不能期望系统来完成所有与并发相关的处理,了解并发的内幕也是成为一-位高级程序员不可缺少的课程。第五部分包括第12~ 13章:

第12章讲解了虚拟机Java内存模型的结构及操作,以及原子性、可见性和有序性在Java内存模型中的体现;介绍了先行发生原则的规则及使用,以及线程在Java语言之中是如何实现的;还提前介绍了目前仍然在实验室状态的Java协程的相关内容。

第3版更新:重写了原有的对]ava内存模型部分过时和过于晦涩的描述,增加了面向]ava未来基于协程的新并发模型的介绍。

 

第13章介绍 了线程安全所涉及的概念和分类、同步实现的方式及虚拟机的底层运作原理,并且介绍了虚拟机实现高效并发所做的一系列锁优化措施。

第3版更新:本章主体内容并没有过多变化,但对不少细节进行了修饰,对一些读者疑问较多的地方进行了补充讲解。

 

最后,给大家分享本文的Java虚拟机参考内容

本文名为"深入理解Java虚拟机” ,但要想真的深入理解虚拟机,仅凭本文肯定是远远不够的,读者可以通过以下方式查找到更多关于Java虚拟机方面的资料。笔者在写作此文的时候,也从下面这些参考资料中得到过很大的帮助。

1.《Java虛拟机规范》

要学习虚拟机,《Java虚拟机规范》 无论如何都是必须读的。这本书的概念和细节描述与Sun的早期虚拟机(Sun Classic虚拟机)高度吻合,随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的方式差距越来越大,如果只能选择一本参考 书来了解Java虚拟机,那必然是这本书。

第1章 引言
1.1 简史
1.2 Java虚拟机
1.3 各章节摘要
1.4 说明
1.5 反馈
第2章 Java虚拟机结构
2.1 class文件格式
2.2 数据类型
2.3 原始类型与值
2.3.1 整数类型与整型值
2.3.2 浮点类型、取值集合及浮点值
2.3.3 returnAddress类型和值
2.3.4 boolean类型
2.4 引用类型与值
2.5 运行时数据区
2.5.1 pc寄存器
2.5.2 Java虚拟机栈
2.5.3 Java堆
2.5.4 方法区
2.5.5 运行时常量池
2.5.6 本地方法栈
2.6 栈帧
2.6.1 局部变量表
2.6.2 操作数栈
2.6.3 动态链接
2.6.4 方法调用正常完成
2.6.5 方法调用异常完成
2.7 对象的表示
2.8 浮点算法
2.8.1 Java虚拟机和IEEE,754中的浮点算法
2.8.2 浮点模式
2.8.3 数值集合转换
2.9 特殊方法
2.10 异常
2.11 字节码指令集简介
2.11.1 数据类型与Java虚拟机
2.11.2 加载和存储指令
2.11.3 算术指令
2.11.4 类型转换指令
……
第3章 Java虚拟机编译器
第4章 class文件格式
第5章 加载、链接与初始化
第6章 Java虚拟机指令集
第7章 操作码助记符
附录A Limited License Grant

2.《]ava语言规范》

虽然Java虚拟机并不是Java语言专有的,但是了解Java语言的各种细节规定对虚拟机的行为也是很有帮助的,它与《Java虚拟机规范》一样都是Oracle官方直接出版的书籍,而且这本书还是由Java之父James Gosling亲自执笔撰写。

第1章 概述 1
第2章 文法 6
第3章 词法结构 9
第4章 类型、值和变量 25
第5章 类型转换与上下文 59
第6章 名字 84
第7章 包 113
第8章 类 123
第9章 接口 184
......

3.《垃圾回收算法手册:自动内存管理的艺术

2016年3月由机械工业出版社引进翻译,这是一本真正的教科书式的学术著作,是垃圾收集技术领域中的唯一必读的书籍。 该书从硬件与软件的发展给垃圾回收所带来的新挑战出发,探讨了这些挑战给高性能垃圾回收器的设计者与实现者所带来的影响,涵盖了并行垃圾回收、增量式垃圾回收、并发垃圾回收以及实时垃圾回收,描述各种算法与概念。唯一缺点是由于过于专业, 所以显得比较晦涩,不适合作为入门书籍使用。

第1章 引言1
第2章 标记–清扫回收 15
第3章 标记–整理回收 28
第4章 复制式回收 38
第5章 引用计数 49
第6章 垃圾回收器的比较 64
第7章 内存分配 72
第8章 堆内存的划分 87
第9章 分代垃圾回收 95
第10章 其他分区策略 117
第11章 运行时接口 138
第12章 特定语言相关内容 188
第13章 并发算法预备知识 202
第14章 并行垃圾回收 242
第15章 并发垃圾回收 271
第16章 并发标记–清扫算法 285
第17章 并发复制、并发整理算法 298
第18章 并发引用计数算法 322
第19章 实时垃圾回收 333

4.《]ava性能优化权威指南》

此书是"The Java"系列(该系列中最出名的《Effective Java》许多人都读过)图书中最新的一本,但也有一定的历史了。 2011年10月出版,2014年3月由人民邮电出版社引进翻译。这本书并非全部都围绕Java虚拟机展开(只有第3、4、7章直接与Java虚拟机相关),而是从操作系统到基于Java的上层程序性能度量和调优进行全面介绍。其中涉及Java虚拟机的内容具备一定深度和很好的可实践性。

第1章 策略、方法和方法论    
第2章 操作系统性能监控   
第3章 JVM概览    
第4章 JVM性能监控    
第5章 Java应用性能分析    
第6章 Java应用性能分析技巧  
第7章 JVM性能调优入门  
第8章 Java应用的基准测试   
第9章 多层应用的基准测试   
第10章 Web应用的性能调优  
第11章 Web Service的性能   
第12章 Java持久化及Enterprise Java Bean的性能  

总结

为了让大家更加深入理解Java虚拟机,小编特意把Java虚拟机方面的资料都给整理出来了,希望能帮助到大家的学习!!

 

需要这五大部分深入理解Java虚拟机在线文档的朋友,可以转发关注小编👇👇👇

大家好好学习吧!!