官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/
文档目录及简介
1. 引言
- 历史背景:介绍了Java编程语言的起源及其设计目标,强调了Java虚拟机(JVM)在跨平台兼容性、安全性以及可扩展性方面的重要性。
- JVM概述:简要介绍了JVM的架构,包括其硬件独立性、指令集以及对字节码的执行机制。
- 规范组织:说明了本规范的结构,包括对JVM架构、指令集、类文件格式等的详细描述。
- 符号表示:解释了文档中使用的符号和术语,例如对类和接口的引用方式。
- 反馈机制:提供了读者反馈错误和疑问的渠道。
2. Java虚拟机结构
- 类文件格式:详细描述了JVM的类文件格式,包括其结构、数据类型、常量池等。
- 数据类型:介绍了JVM支持的原始类型和引用类型,以及它们的值范围。
- 运行时数据区:解释了JVM的运行时数据区,包括程序计数器、Java虚拟机栈、堆、方法区等。
- 帧结构:描述了JVM在方法调用时创建的帧结构,包括局部变量表、操作数栈等。
- 对象表示:讨论了JVM中对象的内部表示方式。
- 浮点运算:介绍了JVM对浮点数的支持,包括IEEE 754标准的实现。
- 特殊方法:解释了JVM中的特殊方法,如构造方法和类初始化方法。
- 异常处理:详细说明了JVM中异常的表示、抛出和捕获机制。
- 指令集概览:提供了JVM指令集的概览,包括指令的分类和作用。
- 类库支持:讨论了JVM对Java SE平台类库的支持。
- 公共设计与私有实现:强调了JVM规范的灵活性,允许实现者在满足规范的前提下自由实现内部机制。
3. Java虚拟机的编译
- 示例格式:介绍了如何通过示例代码展示Java代码编译为JVM字节码的过程。
- 常量、局部变量和控制结构的使用:通过示例展示了如何在JVM字节码中使用常量、局部变量和控制结构。
- 算术运算:解释了JVM如何执行算术运算,并提供了相关字节码示例。
- 访问运行时常量池:介绍了如何通过字节码访问运行时常量池中的数据。
- 方法调用:详细说明了JVM中方法调用的字节码表示。
- 类实例操作:讨论了如何在JVM中创建和操作类实例。
- 数组操作:介绍了JVM中数组的创建和操作。
- switch语句的编译:解释了如何将Java中的switch语句编译为JVM字节码。
- 操作数栈操作:展示了如何通过字节码操作操作数栈。
- 异常抛出和处理:详细说明了异常抛出和处理的字节码实现。
- finally块的编译:讨论了如何将Java中的finally块编译为JVM字节码。
- 同步机制:介绍了JVM中同步机制的实现。
- 注解:讨论了如何在类文件中表示注解。
4. 类文件格式
- ClassFile结构:详细描述了类文件的ClassFile结构,包括其各个组成部分的作用和格式。
- 名称的内部形式:介绍了类和接口名称在类文件中的表示方式。
- 描述符:解释了字段描述符和方法描述符的语法和作用。
- 常量池:详细说明了常量池的结构和作用,包括各种常量池条目的格式和用途。
- 字段和方法:描述了字段和方法在类文件中的表示方式。
- 属性:介绍了类文件中属性的作用和格式,包括预定义属性和自定义属性。
- 格式检查:讨论了JVM在加载类文件时进行的格式检查。
- JVM代码的约束:详细说明了JVM代码必须满足的静态和结构约束。
- 类文件的验证:介绍了JVM如何通过类型检查和类型推断来验证类文件的正确性。
5. 类的加载、链接和初始化
- 运行时常量池:讨论了运行时常量池的作用和初始化过程。
- JVM启动:介绍了JVM的启动过程。
- 类的创建和加载:详细说明了类的加载机制,包括引导类加载器和用户定义类加载器的作用。
- 链接:解释了类的链接过程,包括验证、准备和解析。
- 初始化:讨论了类的初始化过程,包括类初始化方法的调用。
- 绑定本地方法实现:介绍了如何绑定本地方法的实现。
- JVM退出:讨论了JVM的退出机制。
6. Java虚拟机指令集
- 假设和“必须”:解释了文档中“必须”一词的含义。
- 保留操作码:讨论了保留操作码的作用。
- 虚拟机错误:介绍了JVM可能抛出的错误类型。
- 指令描述格式:说明了指令描述的格式和内容。
- 指令:详细列出了JVM的所有指令及其作用,包括加载、存储、算术运算、类型转换、对象创建、操作数栈管理、控制转移、方法调用、异常抛出和同步等。
7. 按操作码索引的操作码助记符
- 操作码助记符表:提供了一个按操作码值索引的操作码助记符表,方便查找和使用。
附录A:有限许可授权
- 许可声明:提供了关于类文件格式的有限许可授权声明。