java线性代码 java线性数据结构有哪些( 五 )


第一个字节*256+第二个字节字节码指令流一般只是字节对齐的 。指令tabltch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐 。
2.寄存器
Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似 。
Java虚拟机的寄存器有四种:
pc:Java程序计数器 。
optop:指向操作数栈顶端的指针 。
frame:指向当前执行方法的执行环境的指针 。
vars:指向当前执行方法的局部变量区第一个变量的指针 。
Java虚拟机
Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器) 。
所有寄存器都是32位的 。
3.栈
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区 。
(1)局部变量区
每个Java方法使用一个固定大小的局部变量集 。它们按照与vars寄存器的字偏移量来寻址 。局部变量都是32位的 。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址 。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间 。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的 。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令 。
(2)运行环境区
在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播 。
·动态链接
运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接 。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号 。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址 。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码 。
·正常的方法返回
如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值 。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去 。
·异常和错误传播
异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件 。②运行时错,如对一个空指针的引用
·程序使用了throw语句 。
当异常发生时,Java虚拟机采取如下措施:
·检查与当前方法相联系的catch子句表 。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址 。
·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型 。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过 。
·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的 。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况 。

推荐阅读