Java应用程序开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码(字节码),这一编译过程与c/c++的编译有些不同,当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的;而java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保存在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址,这样就有效的保证了java的可移植性和安全性,
那么,一个java程序的运行过程到底是怎样的呢,下面我们来通过一个简单的java程序来说明,
1.首先,先写一个java类为 HelloWorld.java 源文件如下:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello world!");
}
}
运行JVM字节码的工作是由解释器来完成的,整个解释执行过程分为三步:代码的装入、代码的校验、代码的执行。
装入代码的工作由“类装载器(class loader)”来完成,类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调用的类。
装入完成之后接下来,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出、非法数据类型转化等多种错误。通过校验之后,代码就开始执行了。
2. 上述代码在经过java编译器编译之后,会得到一个HelloWorld.class的二进制字节码文件,即如图中的 “程序的类文件”,另外在该程序中调用了Java API中的java.lang.System类的静态成员out及其静态方法 public static void println(String string).然后让虚拟机来执行这个HelloWorld,具体过程如下所示。
(1)虚拟机在classpath中找到 HelloWorld.class。
(2)虚拟机中的解释器会把HelloWorld.class解释成机器码。
(3)把解释后的机器码交由 execution engine(执行引擎)执行。
(4)执行引擎调用 native method(本地方法)在Host operating system(宿主操作系统)的显示器的指定位置输出指定的字符串。
(5)此时就可以在控制台中看到输出“Hello World!”的结果。
下图是程序的运行过程: