JVM第三篇 — JVM是怎么工做的?

    本文摘自: http://blog.163.com/guixl_001/blog/static/41764104201082961141664/,并稍加整理。ui

package demo;

public class Volcano {
    public static void main(String[] args) {
        Lava lava = new Lava();
        lava.flow();
    }
}

class Lava {
    private int speed = 5;
    void flow() {
        speed++;
        System.out.println(speed);
    }
}

    下面咱们描述一下main()方法的第一条指令的字节码是如何被执行 的。不一样的JVM有不一样的实现,这只是其中的一种实现。指针

    为了运行这个程序,咱们会以某种方式把“demo.Volcano"传给JVM,JVM找到并读取这个类文件;它从类文件提取类型信息并写入方法区,经过解析方法区中的字节码激活main()方法。 在执行时,JVM保持了一个指向当前类Volcano的常量池的指针。code

    注意,JVM在尚未加载Lava类的时候就已经开始执行了。正像大多数的 JVM同样,不是等全部类都加载了之后才开始执行,而是只会在须要的时候作加载。对象

    main()的第一条指令告知JVM对位于常量池中第一项的类作初始化:JVM经过指向Volcano常量池的指针找到第一项,发现是一个对Lava类的符号引用,而后它就检查方法区看Lava类是否已被加载。blog

    这个符号引用就是类Lava类的完整有效名“demo.Lava”, 当JVM发现尚未加载过名称为“demo.Lava”的类,它就开始查找并加载类文件"demo.Lava.class",从类文件中抽取类型信息并写入方法区。get

    而后,JVM以一个直接指向方法区Lava类的指针替换了常量池第一项的符号引用,以后就能够用这个指针快速的找到Lava类了。而这个替换过程也称为常量池解析(constant pool resolution)。io

    终于,JVM开始为新的Lava对象分配空间了:JVM经过指向Lava类的指针(刚才指向volcano常量池第一项的指针)获得一个Lava对象究竟须要多少空间。 一旦JVM知道了一个Lava对象所要的空间,它就在堆上分配这个空间并为实例变量初始化正确的值。class

    当把新生成的Lava对象的引用压到栈中,第一条指令也结束了。下面的指令会用这个引用激活Lava对象的flow()方法。gui

相关文章
相关标签/搜索