本文更倾向于是Java虚拟机规范的笔记,因为不是做翻译,为了避免强行翻译带来更大的误解,所以不知道怎么翻译的地方就不翻译了嗷(?
本系列不会长久,可能过了几篇就会换种方式学习jvm,先试试水。
第二章:Java虚拟机结构
本文档specifies一个抽象机,不包含任何Java虚拟机的具体实现。
要正确实现Java虚拟机,你只需要阅读class文件,并正确执行里面的操作。
不属于Java虚拟机规范的部分实现将不必要地限制实现的创造性,比如,运行时数据区的内存布局,垃圾回收机制算法,以及任何内部的JVM优化指令(比如把它们翻译成机器代码)都由实现者自由决定。
2.1. class文件格式
Java虚拟机要执行的已编译代码使用独立于硬件和操作系统的二进制格式表示,经常(不一定)存储称为类文件格式的文件中。class文件格式精确地定义一个类或接口的表示形式。
2.2. 数据类型
像Java编程语言一样,Java虚拟机操作两种类型:基本类型和引用类型。相对应地,可以将两种类型的值存储在变量中,通过参数传递,通过方法返回,对基本值和引用值进行操作。
Java虚拟机希望所有类型检查在运行时优先完成(通常友编译器完成),不用它自己来搞。基本类型的值不需要被标记,也不需要以其他方式检查以在运行时确定其类型,也不必与引用类型的值区分开。相反,Java虚拟机指令集将用旨在操作特定类型值进行运算的指令区分它的操作数类型。比如iadd,ladd,fadd,还有dadd都是将两个数值相加并得出结果的JVM指令,但是每个都分别用于特定的操作数类型:int, long, float, and double。
2.3. 基本类型和值
JVM支持的基本类型有数值类型,布尔类型,返回地址类型。
数值类型包括整数类型和浮点值类型。
整数类型有:
byte,8位带符号补码整数,默认值为0
short,16位带符号补码整数,默认值为0
int,32位带符号补码整数,默认值为0
long,64位带符号补码整数,默认值为0
char,16位无符号整数,表示Basic Multilingual Plane中的Unicode代码点,以UTF-16编码,默认值为空代码(‘\u0000’)
浮点类型有:
float,其值为浮点数集合的元素,如果有些地方支持的话,还可以是float-extended-exponent值集的元素,默认值为正0
double,其值为double值的元素,在支持的地方可以是double-extended-exponent value值集的元素,默认值为正0
布尔类型的值对其真值true和false编码,默认值为false
returnAdress类型是JVM指令操作码的指针。
2.3.1. 整数类型和值
byte,从-128到127(-2^7到2^7-1),inclusive
short,from -32768 to 32767 (-2^15 to 2^15 - 1), inclusive
int,from -2147483648 to 2147483647 (-2^31 to 2^31 - 1), inclusive
long,from -9223372036854775808 to 9223372036854775807 (-2^63 to 2^63 - 1), inclusive
char,from 0 to 65535 inclusive
Reference: