Java代码从编写到运行的过程。

  1. 编译器将源文件(.java)编译为字节码文件(.class)

    • 编译一个类时,先检查类所依赖的类是否被编译,没有则先编译依赖类,然后引用;否则直接引用。若找不到依赖的.java或.class,编译器就报con't find symbol错误。
  2. 运行

    • 类的加载:jvm只在类第一次被使用时加载一次,后期使用不用再加载
    • 类的执行:通过类的实例找到类的方法和属性
1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class Main {

public static void main(String[] args) {
Dog d = new Dog("haShi");
d.displayName();
}
}

class Dog {
private String name;
public Dog(String name) {this.name = name;}
public void displayName() {System.out.println(name);}
}
  1. 完整过程:
    1. 执行java -c Main.java ,编译为Main.class
    2. 执行java Main,运行程序。系统启动一个jvm进程,jvm进程从classpath路径找到Main.class文件,将Main的类信息加载到运行时数据区的方法区内。(类的加载)
    3. 然后找到Main里的主函数入口,开始执行main函数。
    4. 执行main函数第一行Dog d = new Dog("haShi");,jvm就会创建一个Dog对象,发现方法区没有Dog类信息,就将Dog类加载到方法区。
    5. 加载完Dog类之后,jvm就在堆区创建一个Dog实例分配内存,然后调用构造函数初始化实例。这个实例持有指向方法区的类信息(其中包含方法表,java动态绑定的底层实现)的引用。
    6. 当执行dog.displayName()时,jvm根据dog引用找到实例对象,然后根据实例对象持有的方法区中类信息里的方法表,获得displayName()函数的字节码位置。
    7. 最后运行displayName()

java-run



Java      JVM

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!