??xml version="1.0" encoding="utf-8" standalone="yes"?>
Java虚拟机是一个想象中的机?在实际的计算?/a>上通过软g模拟来实现。Java虚拟机有自己惌中的g,?a target="_blank">处理?/a>?a target="_blank">堆栈?a target="_blank">寄存?/a>{?q具有相应的指opȝ?
Java虚拟机的特点
Java语言的一个非帔R要的特点是与^台的无关性。而用Java虚拟机是实现q一特点的关键。一般的高语言如果要在不同的^Cq行,臛_需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同^Cq行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体^台相关的信息,使得Java语言~译E序只需生成在Java虚拟Zq行的目标代?字节?,可以在多种q_上不加修改地q行。Java虚拟机在执行字节?/a>?把字节码解释成具体^C的机器指令执行?
Java虚拟机的使用M
Java虚拟机是Java语言底层实现的基,对Java语言感兴的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定^C实现Java虚拟机的软g人员,Java语言的编译器作者以及要用硬?a target="_blank">芯片实现Java虚拟机的人来?则必Lȝ解Java虚拟机的规范。另?如果你想扩展Java语言,或是把其它语a~译成Java语言的字节码,你也需要深入地了解Java虚拟机?
Java虚拟机支持的数据cd
Java虚拟机支持Java语言的基本数据类型如?
byte://1字节有符h数的补码
short://2字节有符h数的补码
int://4字节有符h数的补码
long://8字节有符h数的补码
float://4字节IEEE754单精度QҎ
double://8字节IEEE754双精度QҎ
char://2字节无符号Unicode字符
几乎所有的Javacd查都是在~译时完成的。上面列出的原始数据cd的数据在Java执行时不需要用g标记。操作这些原始数据类型数据的字节?指o)本n已l指Z操作数的数据cd,例如iadd、ladd、fadd和dadd指o都是把两个数相加,其操作数cd别是int、long、float和double。虚拟机没有lboolean(布尔)cd讄单独的指令。boolean型的数据是由integer指o,包括integerq回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的QҎ。不支持IEEE格式的较旧的计算?在运行Java数D程序时,可能会非常慢?
虚拟机支持的其它数据cd包括:
object//对一个Javaobject(对象)?字节引用
returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指o
?Java数组被当作object处理?
虚拟机的规范对于object内部的结构没有Q何特D的要求。在Sun公司的实C,对object的引用是一个句?其中包含一?a target="_blank">指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表C的E序应该遵守cd规定。Java虚拟机的实现应拒l执行违反了cd规定的字节码E序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址I间的机器上。但是可以创Z个Java虚拟?它自动地把字节码转换?4位的形式。从Java虚拟机支持的数据cd可以看出,JavaҎ据类型的内部格式q行了严D?q样使得各种Java虚拟机的实现Ҏ据的解释是相同的,从而保证了Java的与q_无关性和?
UL性?
Java虚拟Zpȝ?
Java虚拟机由五个部分l成:一l?a target="_blank">指o?/a>、一l寄存器、一?a target="_blank">?/a>、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成䆾,不依赖Q何实现技术或l织方式,但它们的功能必须在真实机器上以某U方式实现?
1.Java指o?
Java虚拟机支持大U?48个字节码。每个字节码执行一U基本的CPUq算,例如,把一个整数加到寄存器,子程序{Uȝ。Java指o集相当于JavaE序的汇~语a?
Java指o集中的指令包含一个单字节的操作符,用于指定要执行的操作,q有0个或多个操作?提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成?
虚拟机的内层循环的执行过E如?
do{
取一个操作符字节;
Ҏ操作W的值执行一个动?
}while(E序未结?
׃指opȝ的简单?使得虚拟机执行的q程十分?从而有利于提高执行的效率。指令中操作数的数量和大是由操作符军_的。如果操作数比一个字节大,那么它存储的序是高位字节优先。例?一?6位的参数存放时占用两个字?其gؓ:
W一个字?256+W二个字节字节码指o一般只是字节对齐的。指令tabltch和lookup是例?在这两条指o内部要求强制?字节边界寚w?
2.寄存?
Java虚拟机的寄存器用于保存机器的q行状?与微处理器中的某些专用寄存器cM?
Java虚拟机的寄存器有四种:
pc:JavaE序计数器?
optop:指向操作数栈端的指针?
frame:指向当前执行Ҏ的执行环境的指针?
vars:指向当前执行Ҏ的局部变量区W一个变量的指针?
Java虚拟?
Java虚拟机是栈式?它不定义或用寄存器来传递或接受参数,其目的是Z保证指o集的z性和实现时的高效?特别是对于寄存器数目不多的处理器)?
所有寄存器都是32位的?
3.?
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区?
(1)局部变量区 每个JavaҎ使用一个固定大的局部变量集。它们按照与vars寄存器的字偏U量来寻址。局部变量都?2位的。长整数和双_ֺ点数占据了两个局部变量的I间,却按照第一个局部变量的索引来寻址?例如,一个具有烦引n的局部变?如果是一个双_ֺ点?那么它实际占据了索引n和n+1所代表的存储空间?虚拟范ƈ不要求在局部变量中?4位的值是64位对齐的。虚拟机提供了把局部变量中的D载到操作数栈的指?也提供了把操作数栈中的值写入局部变量的指o?
(2)q行环境?在运行环境中包含的信息用于动态链?正常的方法返回以及异怼播?
·动态链?
q行环境包括Ҏ向当前类和当前方法的解释器符可的指?用于支持Ҏ代码的动态链接。方法的class文g代码在引用要调用的方法和要访问的变量时用符受动态链接把W号形式的方法调用翻译成实际Ҏ调用,装蝲必要的类以解释还没有定义的符?q把变量讉K译成与q些变量q行时的存储l构相应的偏Ud址。动态链接方法和变量使得Ҏ中用的其它cȝ变化不会影响到本E序的代码?
·正常的方法返?
如果当前Ҏ正常地结束了,在执行了一条具有正类型的q回指o?调用的方法会得到一个返回倹{执行环境在正常q回的情况下用于恢复调用者的寄存?q把调用者的E序计数器增加一个恰当的数?以蟩q已执行q的Ҏ调用指o,然后在调用者的执行环境中l执行下厅R?
·异常和错误传?
异常情况在Java中被UCError(错误)或Exception(异常),是Throwablecȝ子类,在程序中的原因是:①动态链接错,如无法找到所需的class文g。②q行旉,如对一个空指针的引?
·E序使用了throw语句?
当异常发生时,Java虚拟机采取如下措?
·查与当前Ҏ相联pȝcatch子句表。每个catch子句包含其有效指令范?能够处理的异常类?以及处理异常的代码块地址?
·与异常相匚w的catch子句应该W合下面的条?造成异常的指令在其指令范围之?发生的异常类型是其能处理的异常类型的子类型。如果找C匚w的catch子句,那么pȝ转移到指定的异常处理块处执行;如果没有扑ֈ异常处理?重复L匚w的catch子句的过E?直到当前Ҏ的所有嵌套的catch子句都被查过?
·׃虚拟ZW一个匹配的catch子句处l执?所以catch子句表中的顺序是很重要的。因为Java代码是结构化?因此d以把某个Ҏ的所有的异常处理器都按序排列C个表?对Q意可能的E序计数器的?都可以用U性的序扑ֈ合适的异常处理?以处理在该程序计数器g发生的异常情c?
·如果找不到匹配的catch子句,那么当前Ҏ得到一?未截获异?的结果ƈq回到当前方法的调用?好像异常刚刚在其调用者中发生一栗如果在调用者中仍然没有扑ֈ相应的异常处理块,那么q种错误传播被l箋下去。如果错误被传播到最层,那么pȝ调用一个缺省的异常处理块?
(3)操作数栈?机器指o只从操作数栈中取操作?对它们进行操?q把l果q回到栈中。选择栈结构的原因?在只有少量寄存器或非通用寄存器的机器(如Intel486)?也能够高效地模拟虚拟机的行ؓ。操作数栈是32位的。它用于l方法传递参?q从Ҏ接收l果,也用于支持操作的参数,q保存操作的l果。例?iadd指o两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指o压进堆栈的。这两个整数从堆栈弹出、相?q把l果压回到操作数栈中?
每个原始数据cd都有专门的指令对它们q行必须的操作。每个操作数在栈中需要一个存储位|?除了long和double?它们需要两个位|。操作数只能被适用于其cd的操作符所操作。例?压入两个intcd的数,如果把它们当作是一个longcd的数则是非法的。在Sun的虚拟机实现?q个限制由字节码验证器强制实行。但?有少数操?操作Wdupe和swap),用于对运行时数据行操作时是不考虑cd的?
4.无用单元攉?
Java的堆是一个运行时数据?cȝ实例(对象)从中分配I间。Java语言h无用单元攉能力:它不l程序员昑ּ释放对象的能力。Java不规定具体用的无用单元攉法,可以Ҏpȝ的需求用各U各L法?
5.Ҏ?
ҎZ传统语言中的~译后代码或是Unixq程中的正文D늱伹{它保存Ҏ代码(~译后的java代码)和符可。在当前的Java实现?Ҏ代码不包括在无用单元攉堆中,但计划在来的版本中实现。每个类文g包含了一个JavacL一个Java界面的编译后的代码。可以说cL件是Java语言的执行代码文件。ؓ了保证类文g的^台无x?Java虚拟范中对类文g的格式也作了详细的说明。其具体l节请参考Sun公司的Java虚拟范?
void sendRedirect(java.lang.String location) throws java.io.IOException
If the response has already been committed, this method throws an IllegalStateException. After using this method, the response should be considered to be committed and should not be written to.
location
- the redirect location URL
java.io.IOException
- If an input or output exception occurs
java.lang.IllegalStateException
- If the response was committed or if a partial URL is given and cannot be converted into a valid URL