JVM的结构
0.概述
JVM规范描述的是一种抽象的机器。它并没有描述任何关于JVM的具体的实际的实现。
为了正确的实现一个JVM,你需要能够读取class文件,并且正确的执行class文件中指定的操作。咋JVM规范中没有涉及具体的实现的部分,这样的做法不会约束实现者的创造力。例如:运行时数据域的内存分布,使用的GC算法,任何JVM指令集的优化等等都被留给JVM实现者去实现,这样给实现者很大的灵活创造的余地。
1.class文件格式
将要被JVM执行的编译后代码被表示成一种与硬件、操作系统无关的二进制文件格式,典型的(但是不一定)就是存储在一个被称为class的文件中。这个class文件准确的描述了一个类或者接口的细节例如字节的顺序以及其他细节的表示。
2.数据类型
像Java编程语言,JVM操作两种类型:原始类型(primitive types)、引用类型(reference types).当然,相应的能被存储在变量中,能被作为参数传递,能被方法返回,能被运算的也有对应的两种值即:原始值(primitive values)、引用值(reference values)。
JVM希望几乎所有的类型检查的工作在运行之前被完成,通常来讲是被一个编译器完成,而不是JVM自己去完成这个类型检查的工作。
原始类型的值(primitive values)不需要被标记或者在运行时被检查或者和引用类型的值作区分。代替的是,JVM的指令集使用操作这些运算对象类型的指令来区别运算对象的类型。例如:iadd,ladd,fadd,和dadd是JVM中加和两个数字类型的值(numeric values)产生数字结果(numeric results)的全部指令了,分别对应的预算对象的类型是int,long,float,double.
JVM包含了对对象概念的显著性的支持。一个对象要么是一个动态分配的类的实例要么是一个数组。一个对对象的引用被认为拥有JVM类型引用。类型引用的值可以被认为是一个指向对象的指针。多个引用指向一个对象的情况是存在的。对象始终是通过类型引用的值被操作,传递,检测。
3.原始类型和值
被JVM支持的原始数据类型是数字类型(numeric types)、boolean类型、返回地址类型(returnAddress type)
数字类型包含整形类型(integral types)、浮点型类型(floating-point types)
.integral types包含如下类型:
byte 8bit(有符号signed)
short 16bit(有符号signed)
int 32bit(有符号signed)
long 64bit(有符号signed)
char 16bit(无符号unsigned)(0-65535)
.floating-point types包含如下类型
float 32bit(有符号signed)
double 64bit(有符号)
.boolean类型
值为true 或者 false 默认值为false
尽管JVM定义了boolean类型,但是它仅仅提供了有限的支持。没有J单独的JVM指令集去单独表示在boolean类型的值上的操作。代替的是,关于boolean类型的值的表达式被编译时使用int数据类型的值。
.returnAddress类型
returnAddress类型的值是指向JVM指令集的操作码的指针。在原始数据类型中,只有returnAddress类型不是直接和Java编程语言直接联系的类型,在Java语言中没有对应的类型并且在运行时不能够被修改。
JVM确实直接提供对boolean数组的支持。它的newarray指令能够适用于创造boolean数组。boolean类型的数组被访问和修改通过使用byte数组的指令baload 和 bastore
JVM是这么编码boolean数组的,使用1代表true,0代表false.在Java编程语言中使用JVMint类型的值来映射boolean类型的值的地方,编译器也必须使用相同的方式进行编码。
4.引用类型和值
有三种引用类型,类,数组,接口,他们的值是对动态创造的类实例,数组,或者实现接口的类实例或者数组的引用。
一个引用的值也许是特殊的null引用,一个对空对象的引用,这种情况基于被表示为null。null引用初始化的时候没有运行时类型,但是能够被转化成任何类型。引用类型的默认值就是 null。
5.运行时数据域(Run-Time Data Areas)
关于运行时数据类型的内容下篇博文继续更新。。。