博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM第三篇 — JVM是怎么工作的?
阅读量:6323 次
发布时间:2019-06-22

本文共 1077 字,大约阅读时间需要 3 分钟。

hot3.png

    本文摘自: ,并稍加整理。

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的常量池的指针。

    注意,JVM在还没有加载Lava类的时候就已经开始执行了。正像大多数的 JVM一样,不是等所有类都加载了以后才开始执行,而是只会在需要的时候做加载。

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

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

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

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

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

转载于:https://my.oschina.net/HuQingmiao/blog/683615

你可能感兴趣的文章
微信程序开发
查看>>
如何退出minicom【学习笔记】
查看>>
Sqlserver 数据库基本查询
查看>>
图书馆维护系统总结
查看>>
[hadoop源码阅读][5]-counter的使用和默认counter的含义
查看>>
SAP HUM 如何对一个HU做上架?
查看>>
LINUX系统中动态链接库的创建与使用{补充}
查看>>
三维视觉国际会议首度在中国举办
查看>>
达索系统入手XFlow开发商 强化3DEXPERIENCE平台的仿真能力
查看>>
自动化运维工具之ansible
查看>>
memcached的安装
查看>>
freebsd系统安装
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Linux LTP 测试框架
查看>>
log4j 每次运行生成文件
查看>>
“经常加班”有误区
查看>>
jquery各种事件触发实例
查看>>
我的友情链接
查看>>
MY TroubleShooting
查看>>