JVM运行的流程

静态变量和构造方法的执行顺序:先开始静态变量的生命周期,再执行构造方法

public class Sample {

int var1 = 1;

static int var2 =2;

public int add(){

     int var3 =var1+ var2;

     return var3;

}

public int delete(){

    int var4=var1-var2;

    return var4;

}

public static void main(String[] args) {

    new Sample().add();

}

}


 当执行"java Sample" 命令时,JVM执行以下流程。

1. 加载Sample类,开始静态变量var2的生命周期,var2位于方法区。                        

2. 创建Sample实例,开始实例变量var1的生命周期, var1位于堆区。

3. 调用Sample实例的add()方法,开始局部变量var3的生命周期,var3位于Java栈区。

4. 执行完毕Sample实例的add()方法,结束局部变量var3的生命周期,退回到main()方法。

5. 执行完毕Sample类的main()方法。

   a.结束Sample实例及它的实例变量var1的生命周期

   b.卸载Sample类,结束静态变量var2的生命周期,Java虚拟机运行结束。


那么我按我的理解来简单的模拟一下jvm运行的过程:

首先JVM启动时会加载java必需的基础类库进内存,放入方法区(不会在启动时把所有的类一次性加载到内存,这样可以节省内存消耗)

1.通过java命令运行含有main方法的class文件,

2.jvm加载这个含有main方法的类,并将这个类的信息存放到方法区中(目前常量区中只是存放了加载的这个类中所包含的常量)。

3.启动一个线程执行mian方法,同样的程序计数器开始记录了,vm栈也创建一个用于保存mian方法所需要的变量的帧。

4.

   a.运行遇到新的类,jvm就加载这个类,并将这个类的信息存放到方法区中,然后要是实例化就放入 Java堆(Heap) 中,并将刚刚实例化对象的引用放到对应的位置(要是是局部变量就放在这个方法对应的帧中,要是是成员变量就放在堆中)

    b. 遇到调用方法,先去方法区去找,要是有对应的方法就启动一个新的线程执行这个方法,同样的程序计数器开始记录了,vm栈也创建一个用于保存该方法所需要的变量的帧

就这样一直运行直到mian方法退出


展开阅读全文

没有更多推荐了,返回首页