深入理解Java虚拟机的五大宝典,轻松搞懂运作原理

虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令 大体上,虚拟机可以分为系统虚拟机和程序虚拟机

大名鼎鼎的Visual Box,Mware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令

无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中

Java虚拟机

Java 虚拟机是一台执行 Java 字节码的虚拟计算机,它拥有独立的运行机制,其运行的 Java 字节码也未必由 Java 语言编译而成
JVM 平台的各种语言可以共享 Java 虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器
Java 技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的 Java 程序都运行在 JVM 内部
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虚拟机方面的资料都给整理出来了,希望能帮助到大家的学习!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系结构对平台无关的支持 2.2.1 Java平台 2.2.2 Java语言 2.3.3 Java class文件 . 2.2.4 可伸缩性 2.3 影响平台无关性的因素 2.3.1 Java平台的部署 2.3.2 Java平台的版本 2.3.3 本地方法 2.3.4 非标准运行时库 2.3.5 对虚拟机的依赖 2.3.6 对用户界面的依赖 2.3.7 Java平台实现中的bug 2.3.8 测试 2.4 平台无关的七个步骤 2.5 平台无关性的策略 2.6 平台无关性和网络移动对象 2.7 资源页 第3章 安全 3.1 为什么需要安全性 3.2 基本沙箱 3.3 类装载器体系结构 3.4 class文件检验器 3.4.1 第一趟:class文件的结构检查 3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10 保护域 3.11 访问控制器 3.11.1 implies()方法 3.11.2 栈检查示例 3.11.3 一个回答“是”的栈检查 3.11.4 一个回答“不”的栈检查 3.11.5 doPrivileged()方法 3.11.6 doPrivileged()的一个无效使用 3.12 Java安全模型的不足和今后的发展 方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 Java体系结构对网络移动性的支持 4.4 applet:网络移动性代码的示例 4.5 Jini服务对象:网络移动对象的示例 4.5.1 Jini是什么 4.5.2 Jini如何工作 4.5.3 服务对象的优点 4.6 网络移动性:Java设计的中心 4.7 资源页 第5章 Java虚拟机 5.1 Java虚拟机是什么 5.2 Java虚拟机的生命周期 5.3 Java虚拟机的体系结构 5.3.1 数据类型 5.3.2 字长的考量 5.3.3 类装载器子系统 5.3.4 方法区 5.3.5 堆 5.3.6 程序计数器 5.3.7 Java栈 5.3.8 栈帧 5.3.9 本地方法栈 5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实机器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊字符串 6.3.1 全限定名 6.3.2 简单名称 6.3.3 描述符 6.4 常量池 6.4.1 CONSTANT_Utf8_info表 6.4.2 CONSTANT_Integer_info表 6.4.3 CONSTANT_Float_info表 6.4.4 CONSTANT_Long_info表 6.4.5 CONSTANT_Double_info表 6.4.6 CONSTANT_Class_info表 6.4.7 CONSTANT_String_info表 6.4.8 CONSTANT_Fieldref_info表 6.4.9 CONSTANT_Methodref_info表 6.4.10 CONSTANT_InterfaceMethodref_ info表 6.4.11 CONSTANT_NameAndType_info 表 6.5 字段 6.6 方法 6.7 属性 6.7.1 属性格式 6.7.2 Code属性 6.7.3 ConstantValue属性 6.7.4 Deprecated属性 6.7.5 Exceptions属性 6.7.6 InnerClasses属性 6.7.7 LineNumberTable属性 6.7.8 LocalVariableTable属性 6.7.9 SourceFile属性 6.7.10 Synthetic属性 6.8 一个模拟:“Getting Loaded” 6.9 随书光盘 6.10 资源页 第7章 类型的生命周期 7.1 类型装载、连接与初始化 7.1.1 装载 7.1.2 验证 7.1.3 准备 7.1.4 解析 7.1.5 初始化 7.2 对象的生命周期 7.2.1 类实例化 7.2.2 垃圾收集和对象的终结 7.3 卸载类型 7.4 随书光盘 7.5 资源页 第8章 连接模型 8.1 动态连接和解析 8.1.1 解析和动态扩展 8.1.2 类装载器与双亲委派模型 8.1.3 常量池解析 8.1.4 解析CONSTANT_Class_info入口 8.1.5 解析CONSTANT_Fieldref_info 入口 S.1.6 解析CONSTANT_Methodref_info 入口 8.1.7 解析CONSTANT_Interface- Methodref_info入口 8.1.8 解析CONSTANT_String_info入口 8.1.9 解析其他类型的入口 8.1.10 装载约束 8.1.11 编译时常量解析 8.1.12 直接引用 8.1.13 _quick指令 8.1.14 示例:Salutation程序的连接 8.1.15 示例:Greet程序的动态扩展 8.1.16 使用1.1版本的用户自定义类装 载器 8.1.17 使用1.2版本的用户自定义类装 载器 8.1.18 示例:使用forName()的动态扩展 8.1.19 示例:卸载无法触及的greeter类 8.1.20 示例:类型安全性与装载约束 8.2 随书光盘 8.3 资源页 第9章 垃圾收集 9.1 为什么要使用垃圾收集 9.2 垃圾收集算法 9.3 引用计数收集器 9.4 跟踪收集器 9.5 压缩收集器 9.6 拷贝收集器 9.7 按代收集的收集器 9.8 自适应收集器 9.9 火车算法 9.9.1 车厢、火车和火车站 9.9.2 车厢收集 9.9.3 记忆集合和流行对象 9.10 终结 9.11 对象可触及性的生命周期 9.11.1 引用对象 9.11.2 可触及性状态的变化 9.11.3 缓存、规范映射和临终清理 9.12 一个模拟:“Heap of Fish” 9.12.1 分配鱼 9.12.2 设置引用 9.12.3 垃圾收集 9.12.4 压缩堆 9.13 随书光盘 9.14 资源页 第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“Fibonacci Forever” 10.7 随书光盘 10.8 资源页 第11章 类型转换 11.1 转换操作码 11.2 一个模拟:“Conversion Diversion” 11.3 随书光盘 11.4 资源页 第12章 整数运算 12.1 二进制补码运算 12.2 Inner Int:揭示Java int类型内部性质 的applet 12.3 运算操作码 12.4 一个模拟:“Prime Time” 12.5 随书光盘 12.6 资源页 第13章 逻辑运算 13.1 逻辑操作码 13.2 一个模拟:“Logical Results” 13.3 随书光盘 13.4 资源页 第14章 浮点运算 14.1 浮点数 14.2 Inner Float:揭示Java float类型内部 性质的applet 14.3 浮点模式 14.3.1 浮点值集合 14.3.2 浮点值集的转换 14.3.3 相关规则的本质 14.4 浮点操作码 14.5 一个模拟:“Circle of Squares” 14.6 随书光盘 14.7 资源页 第15章 对象和数组 15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 16.3 使用表的条件分支 16.4 一个模拟:“Saying Tomato” 16.5 随书光盘 16.6 资源页 第17章 异常 17.1 异常的抛出与捕获 17.2 异常表 17.3 一个模拟:“Play Ball!” 17.4 随书光盘 17.5 资源页 第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“Hop Around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 Java方法的调用 19.1.2 本地方法的调用 19.2 方法调用的其他形式 19.3 指令invokespecial 19.3.1 指令invokespecial和[init]()方法 19.3.2 指令invokespecial和私有方法 19.3.3 指令invokespecial和super关键字 19.4 指令invokeinterface 19.5 指令的调用和速度 19.6 方法调用的实例 19.7 从方法中返回 19.8 随书光盘 19.9 资源页 第20章 线程同步 20.1 监视器 20.2 对象锁 20.3 指令集中对同步的支持 20.3.1 同步语句 20.3.2 同步方法 20.4 Object类中的协调支持 20.5 随书光盘 20.6 资源页 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值