什么是虚拟机技术 什么是虚拟机( 二 )


便携性 。
二、Java虚拟机架构
Java虚拟机由五部分组成:一组指令集、一组寄存器、一个堆栈、一个垃圾收集堆和一个* * *区 。这五个部分是Java虚拟机的逻辑组成部分,不依赖于任何实现技术或组织,但它们的功能必须以某种方式在真机上实现 。
1.Java指令集
Java虚拟机支持大约248个字节码 。每个字节码执行一个基本的CPU操作,比如向寄存器中添加一个整数,子例程转移等 。Java指令集相当于Java程序的汇编语言 。
Java指令集中的指令包含一个单字节运算符来指定要执行的操作,以及零个或多个操作数来提供操作所需的参数或数据 。许多指令没有操作数,只包含一个单字节运算符 。
虚拟机内部循环的执行过程如下:
做{
取一个操作符字节;
根据操作符的值执行操作;
}while(程序未完成)
由于指令系统的简单性,虚拟机的执行过程非常简单,有利于提高执行效率 。指令中操作数的数量和大小由运算符决定 。如果操作数大于一个字节,它的存储顺序是高字节优先 。例如,一个16位参数在存储时占用两个字节,其值为:
之一个字节*256+第二个字节字节码指令流通常是字节对齐的 。例外情况是指令和,它们需要强制的4字节边界对齐 。
注册
Java虚拟机的寄存器用来保存机器的运行状态,类似于微处理器中的一些特殊寄存器 。
Java虚拟机有四种寄存器:
Pc:Java程序计数器 。
Optop:指向操作数堆栈顶部的指针 。
Frame:指向当前执行* * *的执行环境的指针 。
Vars:指向当前正在执行的* * * *的局部变量区域的之一个变量的指针 。
java虚拟机
Java虚拟机是堆叠的 。它不定义或使用寄存器来传递或接受参数 。其目的是保证指令集的简单性和实现的效率(特别是对于寄存器较少的处理器) 。
所有寄存器都是32位的 。
堆积
Java虚拟机的堆栈有三个区域:局部变量区、运行环境区和操作数区 。
(1)局部变量区中的每个Java ***都使用一组固定大小的局部变量 。它们根据vars寄存器的字偏移量进行寻址 。局部变量都是32位的 。长整数和双精度浮点数在两个局部变量之间占用空,但根据之一个局部变量的索引寻址 。(例如,如果一个索引为n的局部变量是一个双精度浮点数,它实际上占用了索引n和n+1 空所表示的存储 。虚拟机规范不要求局部变量中的64位值是64位对齐的 。虚拟机提供将局部变量中的值加载到操作数堆栈中的指令,并且还提供将操作数堆栈中的值写入局部变量中的指令 。
(2)运行环境区包含的信息用于动态链接、正常* * *返回和异常传播 。
动态连接
运行时环境包括指向当前类和当前解释器符号表的指针,以支持* * *代码的动态链接 。* * *的类文件代码在引用要调用的* * *和要访问的变量时使用符号 。动态链接将符号* * *调用翻译成实际的* * *调用,加载必要的类来解释未定义的符号,并将变量访问翻译成与这些变量的运行时存储结构相对应的偏移地址 。动态链接* * *和变量,使得* * *中使用的其他类的变化不会影响这个程序的代码 。
正常* * *退货
如果当前* * *正常结束,当执行正确类型的返回指令时,被调用的* * *将获得返回值 。执行环境用于在调用者正常返回时,恢复调用者的寄存器,并将调用者的程序计数器增加一个适当的值,跳过已执行的* * *调用指令,然后在调用者的执行环境中继续执行 。
异常和错误传播
在Java中称为Error或,是类的子类 。程序中的原因有:①动态链接错误,比如没有找到需要的类文件 。②运行时错误,比如对空指针的引用 。