Java虚拟机结构(一)

JVM的结构

如下部分来源自Oracle公司官网的技术文档
连接地址

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类型引用。类型引用的值能够被认为是一个指向对象的指针。多个引用指向一个对象的状况是存在的。对象始终是经过类型引用的值被操做,传递,检测。html

 

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) 关于运行时数据类型的内容下篇博文继续更新。。。
相关文章
相关标签/搜索