java虚拟机由如下五个部分组成:
一组指令集
一组寄存器
一个栈
一个无用单元收集堆
一个方法区
1.Java指令集
Java虚拟机支持大约248个字节码,每个字节码执行一种基本的CPU运算,例如把一个整数加到寄存器、子程序转移等。Java指令集相当于Java程序的汇编语言。
虚拟机的内层循环执行过程如下:
do{
取一个操作符字节;
根据操作符的值执行一个动作;
}while(程序未结束)
2.寄存器
java虚拟机的寄存器用于保存机器的运行状体,与微处理器中的某些专用寄存器类似,所有寄存器都是32位的。在java虚拟机中有如下4种寄存器。
pc:java程序计数器
optop:指向操作数栈顶端的指针
frame: 指向当前指向方法的执行环境的指针
vars:指向当前指向方法的局部变量区第一个变量的指针。java虚拟机是栈式的,它不定义或使用寄存器来传递或接收参数,目的是保证指令集的简洁性和实现时的高效性。
3.栈
Java虚拟机中的栈有三个区域,分别是局部变量区、运行环境区、操作数区。
1.局部变量区
每个Java方法使用一个固定大小的局部变脸就,长整数和双精度占据两个局部变量的空间,安装第一个局部变量索引来寻址(如,一个具有索引n的局部变量,如果是一个双精度浮点数,时间占据了n和n+1所代表的存储空间)。
2.运行环境区
在运行环境中包含的信息可以实现动态链接、正常方法区返回与异常和错误的传播
2.1.动态链接
运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号。
2.2.正常的方法返回
执行了具有正确类型的返回指令时,调用的方法会得到一个返回值。
2. 3.异常和错误传播
异常情况在Java中被称作Error或异常,是Throwable类的子类,在程序中:
2.3.1.动态链接错
2.3.2.运行时错,如对一个空指针的引用程序使用了throw语句
3.操作数栈区
机器指令只从操作数栈中去操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器上,也能够高效的模拟虚拟机的行为。
4.无用单元收集堆
Java的堆是一个运行时数据区,类的实例从中分配空间。
5.方法区
它保存方法代码和符号表。方法代码不包括在无用单元收集堆中。
每个Java虚拟机实例都有一个方法区以及一个堆,它们是由该虚拟机实例中所有线程共享的。当虚拟机装载一个class文件时,他会从这个class文件所包含的二进制数据中解析类型信息。创建的对象放到堆中。
java虚拟机没有寄存器,其指令集使用java栈来存储中间数据。这样设计的原因是保存java虚拟机的指令集尽量紧凑,同时也便于Java虚拟机在那些很少通用寄存器的平台上实现,另外Java虚拟机是基于栈的体系结构的,有助于运行时某些虚拟机实现动态编译器和即使编译器的代码优化。
任何线程都不能访问另外一个线程的Pc寄存器或者Java栈。