Java每条代码由谁执行 java中的程序代码都必须( 二 )


这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象 。
这些定义为JVM解释器开发人员提供了所需的信息和开发环境 。
Java的设计者希望给开发人员以随心所欲使用Java的自由 。
JVM定义了控制Java代码解释执行和具体实现的五种规格,它们是:
JVM指令系统
JVM寄存器
JVM栈结构
JVM碎片回收堆
JVM存储区
2.1JVM指令系统
JVM指令系统同其他计算机的指令系统极其相似 。
Java指令也是由操作码和操作数两部分组成 。
操作码为8位二进制数,操作数进紧随在操作码的后面,其长度根据需要而不同 。
操作码用于指定一条指令操作的性质(在这里Java每条代码由谁执行我们采用汇编符号的形式进行说明) , 如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的"与",ret用于流程控制 , 表示从对某一方法的调用中返回 。
当长度大于8位时,操作数被分为两个以上字节存放 。
JVM采用了"bigendian"的编码方式来处理这种情况,即高位bits存放在低字节中 。
这同Motorola及其他的RISCCPU采用的编码方式是一致的,而与Intel采用的"littleendian"的编码方式即低位bits存放在低位字节的方法不同 。
Java指令系统是以Java语言的实现为目的设计的,其中包含了用于调用方法和监视多先程系统的指令 。
Java的8位操作码的长度使得JVM最多有256种指令 , 目前已使用了160多种操作码 。
2.2JVM指令系统
所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组 。
如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度 。
然而,如果虚拟机中的寄存器比实际CPU的寄存器多 , 在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率 。
针对这种情况,JVM只设置了4个最为常用的寄存器 。
它们是:
pc程序计数器
optop操作数栈顶指针
frame当前执行环境指针
vars指向当前执行环境中第一个局部变量的指针
所有寄存器均为32位 。
pc用于记录程序的执行 。
optop,frame和vars用于记录指向Java栈区的指针 。
2.3JVM栈结构
作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法 。
当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息 。
每个栈框架包括以下三类信息:
局部变量
执行环境
操作数栈
局部变量用于存储一个类的方法中所用到的局部变量 。
vars寄存器指向该变量表中的第一个局部变量 。
执行环境用于保存解释器对Java字节码进行解释过程中所需的信息 。
它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针 。
执行环境是一个执行一个方法的控制中心 。
例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶 。
操作数栈用于存储运算所需操作数及运算的结果 。
2.4JVM碎片回收堆
Java类的实例所需的存储空间是在堆上分配的 。
解释器具体承担为类实例分配空间的工作 。
解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用 。

推荐阅读