JDK1.8 The Java® Virtual Machine Specification《2.The Structure of the Java Virtual Mach》(1)

初衷,一方面锻炼自己英文阅读能力,主要方面是看看真正官方的话语怎么描述JVM的,希望从中有更深的认识。

没有闲白儿,书归正传。

展示一下第二章目录:

JDK1.8 The Java® Virtual Machine Specification《2.The Structure of the Java Virtual Mach》(1) JDK1.8 The Java® Virtual Machine Specification《2.The Structure of the Java Virtual Mach》(1)

2.java虚拟机结构

 这篇文章叙述了一个抽象的机器的工作原理,它并没有描述任何关于java虚拟机的特殊实现,如果要正常的使用java虚拟机,只需要能正确的读取class文件并且正确的执行class文件中的明确规定的操作命令即可。不是java虚拟机规范中的部分实现细节将会不必要的限制开发者的创造力(暂时并没太懂),例如运行时方法区的内存布局,使用垃圾收集算法和JVM指令优化等将由开发人员自行决定如何实现。

2.1类文件格式

代码会被编译成系统平台或硬件无关的二进制格式,这些二进制文件通常会存储在文件中,这类文件统称为Class文件,但也不绝对...java虚拟机执行这些二进制文件。Class文件精准的表述了一个类或者一个接口中的信息,包括一些特殊平台的对象文件中,字节序列将会自然而然的对应其特殊的格式(暂时不太懂)

2.2 数据类型

跟java编程一样,java虚拟机会操作两类数据类型:基本数据类型性和引用数据类型。于是乎java虚拟机会使用这两类数据类型进行变量赋值,参数传递和方法的返回。java虚拟机在运行前会尽力完成几乎全部数据类型的检查,这个检查的工作通常由java编译器完成,事实上java虚拟机并不管这个事儿。虚拟机对待对象中的基本数据类型并不需要去给他标记一个标签或者用其他的方式在运行时检查他具体是什么类型,甚至并不需要把它跟引用类型进行区分,但是java虚拟机会用特定的指令集分别对待每一个特殊的类型,例如 iadd ladd fadd dadd 都是java虚拟机对于两个操作数值进行相加并获取加后的值的指令,但是他们分别对应的是int long float double类型的数据。

java虚拟机对对象拥有明确的支撑,一个对象不管你是动态分配的实例或者一个数组,Java虚拟机都会为使用一个引用类型的数据去代表一个对象,关于这个引用类型的值就是这个对象的指针,一个对象可能存在多个引用。通过引用类型的值始终可以对这个对象进行各种操作。

2.3 基本数据类型和值

java虚拟机支持的基础数据类型有数字类型,返回地址类型和布尔类型。数字类型包含整数和浮点数类型

其中整型的类型有:

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

浮点类型有:

float 32位 他的值是由单精度浮点元素集组成,并且还支持float-extended-exponent(指数表示形式)结果集,默认值是正零
double 64位 他的值是由双精度浮点元素集组成,并且还支持double-extended-exponent(指数表示形式)结果集,默认值是正零

布尔类型:

布尔类型包含明确的值:true 和 false ,并且默认值是false

第一版的java虚拟机规范并不认为布尔类型是一个java虚拟机可以接纳的数据类型,然而虚拟机对布尔类型的支持有限,到了第二版java虚拟机规范中明确的表示布尔值是一个数据类型。

返回地址类型:

返回地址类型的值表示的是一个指针,它指向了java虚拟机指令操作码的地址,在基本数据类型中,只有返回地址类型无法找到对应java编程语言中的基本类型。