Java虚拟机规范(Java虚拟机的结构)

Java基础

浏览数:345

2019-6-29

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(-27到27 – 1),包括端值。
  • 对于short,从-32768到32767(-215到215 – 1),包括端值。
  • 对于int,从-2147483648到2147483647(-231到231 – 1),包括端值。
  • 对于long,从-9223372036854775808到9223372036854775807(-263到263 – 1),包括端值。
  • 对于char,从0到65535,包括端值。

浮点类型、值集和值

浮点类型是floatdouble,概念上与IEEE二进制浮点算术标准中规定的32位单精度和64位双精度格式IEEE 754值和运算相关联。

IEEE 754标准不仅包括正负号数,还包括正负零,正负无穷大,以及特殊的非数字值(以下简称为“NaN”),NaN值用于表示某些无效操作的结果,例如将零除以零。

Java虚拟机的每个实现都需要支持两个浮点值的标准集,称为浮点值集和双值集,此外,Java虚拟机的实现可以选择支持两个扩展指数浮点值集中的一个或两个,称为浮点扩展指数值集和双扩展指数值集,在某些情况下,可以使用这些扩展指数值集代替标准值集来表示floatdouble类型的值。

任何浮点值集的有限非零值都可以表示为s · m · 2(e – N + 1),其中s为+1或-1,m是小于2N的正整数,e是Emin = -(2K-1-2)和Emax = 2K-1-1之间的整数,包括端值,其中N和K是依赖于值集的参数。有些值可以用多种方式以这种形式表示,例如,假设值集中的值v可能使用s、m和e的某些值表示为此形式,那么如果m是偶数且e小于2K-1,则可以将m减半,将e增加1,以产生相同值v的第二个表示。如果m ≥ 2N-1,这种形式的表示称为标准化,否则该表示被称为非标准化,如果值集中的值不能以m ≥ 2N-1的方式表示,则该值称为非标准化值,因为它没有标准化表示。

作者:博弈