Java虚拟机的结构

本文档指定了一个抽象机器,它没有描述Java虚拟机的任何特定实现。

要正确实现Java虚拟机,你只需要能够读取类文件格式并正确执行其中指定的操作,不属于Java虚拟机规范的实现细节会不必要地限制实现者的创造力。例如,运行时数据区的内存布局、使用的垃圾收集算法、Java虚拟机指令的任何内部优化(例如,将它们转换为机器代码)由实现者自行决定。

本规范中对Unicode的所有引用都是针对Unicode标准版本11.0.0给出的,可从http://www.unicode.org/获取。

class文件格式

由Java虚拟机执行的编译代码使用独立于硬件和操作系统的二进制格式表示,通常(但不一定)存储在文件中,称为class文件格式,类文件格式精确地定义了类或接口的表示,包括可能在特定于平台的目标文件格式中被认为是理所当然的字节排序等细节。

第4章“class文件格式”详细介绍了class文件格式。

数据类型

与Java编程语言一样,Java虚拟机也可以使用两种类型:原始类型和引用类型。相应地,有两种值可以存储在变量中,作为参数传递,由方法返回,并对其进行操作:原始值和引用值。

Java虚拟机期望几乎所有类型检查都在运行时之前完成,通常由编译器完成,而不必由Java虚拟机本身完成,原始类型的值不需要被标记或以其他方式检查以在运行时确定它们的类型,或者与引用类型的值区分开来。相反,Java虚拟机的指令集使用对特定类型的值进行操作的指令来区分其操作数类型,例如,iaddladdfadddadd都是Java虚拟机指令,它们添加两个数值并产生数值结果,但每个指令都专门分别用于其操作数类型:intlongfloatdouble

Java虚拟机包含对对象的显式支持,对象是动态分配的类实例或数组,对对象的引用被视为具有Java虚拟机类型引用,类型引用的值可以被认为是指向对象的指针,一个对象可能存在多个引用,对象总是通过类型引用的值操作、传递和测试。

原始类型和值

Java虚拟机支持的原始数据类型是数字类型、布尔类型和returnAddress类型。

数字类型由整数类型和浮点类型组成。

整数类型是:

  • byte,其值为8位有符号二进制补码整数,其默认值为零。
  • short,其值为16位有符号二进制补码整数,其默认值为零。
  • int,其值为32位带符号的二进制补码整数,其默认值为零。
  • long,其值为64位带符号的二进制补码整数,其默认值为零。
  • char,其值为16位无符号整数,表示基本多语言平面中的Unicode代码点,使用UTF-16编码,其默认值为空代码点('u0000')。

浮点类型是:

  • float,其值是浮点值集的元素,或者,如果支持,则为浮点扩展指数值集,其默认值为正零。
  • double,其值是双精度值集的元素,或者,如果支持,则为双精度扩展指数值集,其默认值为正零。

布尔类型的值对真值truefalse进行编码,默认值为false

Java®虚拟机规范的第一版没有将布尔值视为Java虚拟机类型,但是,布尔值在Java虚拟机中的支持有限,Java®虚拟机规范的第二版通过将布尔值视为一种类型来澄清该问题。

returnAddress类型的值是指向Java虚拟机指令的操作码的指针,在原始类型中,只有returnAddress类型与Java编程语言类型没有直接关联。

整数类型和值

Java虚拟机的整数类型的值是:

  • 对于byte,从-128到127(-2^72^7 - 1),包括在内。
  • 对于short,从-32768到32767(-2^152^15 - 1),包括在内。
  • 对于int,从-2147483648到2147483647(-2^312^31 - 1),包括在内。
  • 对于long,从-9223372036854775808到9223372036854775807(-2^632^63 - 1),包括在内。
  • 对于char,从0到65535,包括在内。