java代码互译 java的翻译命令( 三 )


JVM执行程序的过程 :
I.加载.class文件
II.管理并分配内存
III.执行垃圾收集
JRE(java运行时环境)包含JVM的java程序的运行环境
JVM是Java程序运行的容器,但是他同时也是操作系统的一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间 。
JVM在整个jdk中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也叫虚拟计算机.操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境 。
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂接到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类 。
寄存器
所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组 。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度 。然而,如果虚拟机中的寄存器比实际CPU的寄存器多 , 在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器 , 这反而会降低虚拟机的效率 。针对这种情况 , JVM只设置了4个最为常用的寄存器 。它们是:
pc程序计数器
optop操作数栈顶指针
frame当前执行环境指针
vars指向当前执行环境中第一个局部变量的指针
所有寄存器均为32位 。pc用于记录程序的执行 。optop,frame和vars用于记录指向Java栈区的指针 。寄存器
栈结构
作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法 。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息 。每个栈框架包括以下三类信息:
局部变量
执行环境
操作数栈
局部变量用于存储一个类的方法中所用到的局部变量 。vars寄存器指向该变量表中的第一个局部变量 。
执行环境用于保存解释器对Java字节码进行解释过程中所需的信息 。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针 。执行环境是一个执行一个方法的控制中心 。例如:如果解释器要执行iadd(整数加法) , 首先要从frame寄存器中找到当前执行环境 , 而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶 。
操作数栈用于存储运算所需操作数及运算的结果 。
运行数据
JVM定义了若干个程序执行期间使用的数据区域 。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁 。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁 。分别有程序计数器 , 堆,栈,方法区,运行时常量池 。
运行过程
上面对虚拟机的各个部分进行了比较详细的说明,下面通过一个具体的例子来分析它的运行过程 。
虚拟机通过调用某个指定类的方法main启动 , 传递给main一个字符串数组参数,使指定的类被装载 , 同时链接该类所使用的其它的类型,并且初始化它们 。新建一java源文件并取名HelloApp.java,内容如下:
class HelloApp {
public static void main(String[] args) {
System.out.println("Hello World!");
for (int i = 0; iargs.length; i++ ) {
System.out.println(args);
}
}
}
在命令模式下输入:javac HelloApp.java 进行编译,这时同目录下会产生一个编译后的文件:HelloApp.class
然后在命令行模式下键入:java HelloApp run virtual machine
将通过调用HelloApp的方法main来启动java虚拟机 , 传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组 。我们略述虚拟机在执行HelloApp时可能采取的步骤 。

推荐阅读