Java源文件的编译、下载、解释和执行

来源:互联网 发布:如何设置hp网络打印机 编辑:程序博客网 时间:2024/05/17 17:15

一、Java源文件的编译、下载、解释和执行

1. 执行java程序的步骤:

Java源文件(程序员编写的*.java文件),使用javac编译生成*.class文件(字节码文件),然后使用java解释执行生成特定平台的机器码。

2.java解释执行过程分为代码的装入、代码的校验、代码的执行

2.1 代码的装入:由类加载器(class loader)完成。

类加载器负责加载运行一个程序所需要的所有代码,包括继承的类和被其调用的类。该类被放在自己的名字空间里,除了通过符号引用自己名字空间以外的类,类之间是没有办法可以相互影响。在本机上的所有类都在同一地址空间内,所有从外部引进来的类都有一个自己独立的名字空间。这使得本地类可通过共享相同的名字空间而获得较高的运行效率,同时又保证它们与从外部引进类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用而同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类(父类)改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。

2.2 代码的校验:校验器可发现操作数栈溢出,非法数据类型转化等多种错误。通过了校验后,代码便可开始执行了。

2.3 代码的执行:即时编译、解释执行两种方式

  即时编译:解释器先将字节码编译成机器码,然后再执行该机器码。  解释执行:解释器通过每次解释并执行一小段代码来完成java字节码的所有操作。由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器码的工作具有较高的效率。对于运行速度要求较高的应用程序,解释器可将java字节码即时编译为机器码,从而保证了java代码的可移植性和高性能。

二、JVM规格描述

JVM定义了,控制Java代码解释执行和具体实现的五种规格,它们是: JVM指令系统,JVM寄存器,JVM栈结构,JVM碎片回收堆,JVM存储区。
1. JVM指令系统:

Java指令,也是由操作码和操作数两部分组成。操作码为8位的二进制数,操作数据紧随在操作码后。Java指令系统包含了用于调用方法和监视多线程系统的指令,由于长度为8位,所以JVM最多有256种指令,目前已使用了160多种操作码。

2.JVM寄存器:

寄存器是内存的最顶端,也是系统获取操作资料的最快途径。它是中央处理器的组成部分,是存储容量有限高速存储部件。寄存器可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,存器有累加器(ACC)。寄存器的基本单元是 D触发器,按照其用途分为基本寄存器和移位寄存器。基本寄存器是由 D触发器组成,在 CP 脉冲作用下,每个 D触发器能够寄存一位二进制码。在 D=0 时,寄存器储存为 0,在 D=1 时,寄存器储存为 1。寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过"端口"交换数据,外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为"端口",这种说法不太严格,但经常这样说。外部寄存器虽然也用于存放数据,但是它保存的数据具有特殊的用途。某些寄存器中各个位的0、1状态反映了外部设备的工作状态或方式;还有一些寄存器中的各个位可对外部设备进行控制;也有一些端口作为CPU同外部设备交换数据的通路。所以说,端口是CPU和外设间的联系桥梁。CPU对端口的访问也是依据端口的"编号"(地址),这一点又和访问存储器一样。不过考虑到机器所联接的外设数量并不多,所以在设计机器的时候仅安排了1024个端口地址,端口地址范围为0--3FFH。

JVM只设置了4个最为常用的寄存器。它们是:

pc程序计数器,optop操作数栈顶指针 frame当前执行环境指针vars指向当前执行环境中第一个局部变量的指针 所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。

3. JVM栈结构

作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个java字节码应用程序后,便为该代码中一个类的每一个方法创一个栈框架,用来保存该方法的状态信息。每个栈框架包括以下三类信息:    局部变量    执行环境    操作数栈局部变量:用于存储一个类的方法中所用到的局部变量。Vars寄存器指向该变量表中的第一个局部变量。执行环境:它是执行一个方法的控制中心,用于保存解释器对java字节码进行解释过程中所需要的信息(它们是:上次调用的方法、局部变量指针、操作数栈的栈顶指针和栈底指针)。

4. JVM碎片回收堆

Java类的实例所需的存储空间是在堆上分配的。解释器承担着为实例分配空间的工作。解释器为一个实例分配完空间后,便开始记录该实例对所占内存的使用情况,一旦使用完毕,便将其回收到堆中。

5. JVM存储区:常量缓冲池、方法区

常量缓冲池:用于存储类名称、方法、字段名及串常量。方法区:用于存储java方法的字节码。
1 0