java编译过程_java程序编译和运⾏过程详解
java整个编译以及运⾏的过程相当繁琐,这⾥有个简单的例⼦。
Java程序从源⽂件创建到程序运⾏要经过两⼤步骤:
1、源⽂件由编译器编译成字节码(ByteCode);
2、字节码由java虚拟机解释运⾏。因为java程序既要编译同时也要经过JVM的解释运⾏,所以说Java被称为半解释语⾔(“semi-interpreted” language)。
Java 程序运⾏过程
第⼀步(编译过程)
创建完源⽂件之后,程序先要被JVM中的java编译器进⾏编译为.class⽂件。
1、java编译⼀个类时,如果这个类所依赖的类还没有被编译,编译器会⾃动的先编译这个所依赖的类,然后引⽤。
php for android
2、如果java编译器在指定的⽬录下不到该类所依赖的类的 .class⽂件或者 .java源⽂件,就会报
“Cant found sysbol”的异常错误。
3、编译后的字节码⽂件格式主要分为两部分:常量池和⽅法字节码。
常量池记录的是代码出现过的(常量、类名、成员变量等)以及符号引⽤(类引⽤、⽅法引⽤,成员变量引⽤等);
⽅法字节码中放的是各个⽅法的字节码。
第⼆步(运⾏阶段)
JVM程序在第⼀次运⾏时主动使⽤类的时候,才会⽴即去加载。换⾔之,JVM并不是在运⾏时就会把所有使⽤到的类都加载到内存中,⽽是⽤到的时候,才加载进来,⽽且只加载⼀次!
java类运⾏的过程⼤概分为两个步骤:
(1)类的加载
(2)类的执⾏。
根据上⾯的程序,详解该程序运⾏的详细步骤:
1、类的加载
在类路径下到编译好的 java 程序中;得到 Test.class 字节码⽂件后,在命令⾏上敲 java Test,系统就会启动⼀个 JVM 进程,JVM进程从classpath路径下到⼀个名为Test.class的⼆进制⽂件,将Test.class⽂件中的类信息加载到运⾏时数据区的⽅法区中,这⼀过程叫做类的加载。(只有类信息在⽅法区中,才能创建对象,使⽤类中的成员变量)
2、JVM 到main⽅法的主函数⼊⼝
在主函数⼊⼝持有⼀个指向当前类(Test)常量池的指针,并且常量池中的第⼀项是发现是⼀个对Animal对象的符号引⽤。
并且main⽅法中第⼀条指令是Animal animal = new Animal(“super_yc”),就是让JVM创建⼀个Animal对象。
但是⽅法区中还没有Animal类的类信息,于是JVM就要马上的加载Animal类,将Animal类信息放⼊到⽅法区中。
于是JVM 以⼀个直接指向⽅法区 Animal类的指针替换了常量池中第⼀项的符号引⽤。
3、实例化对象
java下载过程加载完Animal类的信息以后,JVM虚拟机就会在堆内存中为⼀个Animal类实例分配内存,然后调⽤其构造函数初始化Animal实例,
这个实例持有指向⽅法区的Animal类的类型信息(其中包含有⽅法表,java动态绑定的底层实现)的引⽤。(animal指向了Animal对象的引⽤会⾃动的放在栈中,字符串常量”super_yc”会⾃动的放在⽅法区的常量池中,对象会⾃动的放⼊堆区)。
document的方法living room4、程序运⾏
当使⽤animal.printName()的时候,JVM根据栈中animal引⽤到Animal对象,然后根据Animal对象持有的引⽤定位到⽅法区中Animal 类的类型信息⽅法表,获得printName()函数的字节码地址,然后开始运⾏函数。
public class Main {
public static void main(String[] args) {
Animal animal = new Animal("super_yc");
animal.printName();
补码乘法为什么直接乘不对}
}
class Animal{
private String name;
public Animal(String name) {
super();
this.name = name;
}
public void printName(){
System.out.println("Animal = " + this.name);
漂亮的蓝边框图片}
}
java 进程运⾏过程详解

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。