jvm类加载过程

JVM分方法区(放类的信息),堆(放对象实例信息),java栈(1,局部变量栈--放局部变量,操作数栈--放临时计算操作结果,桢数据栈--放常量池引用和异常信息)。
关于类初始化,分为主使用(6个)和被动使用,当主动使用时才初始化--这里可查看“深入java虚拟机”第162页。

JVM使用方法区信息例子
本文是对JVM执行一个Class文件的过程的一个总结。比如,现在我有2个类:
1:Class Lava {
   private int speed = 5;
   void flow() {}
}
2:    Class Volcano {
   public static void main(String [] args) {
    Lava lava =  new Lava ();
    lava.flow()
}
}
下面就是JVM的某个实现执行Class文件的一个过程:
1:JVM找到并读入相应的Class文件 :Volcano.class,然后把导入的二进制数据中提取的类型信息保存到方法区(方法区:保存类型信息的运行时数据区,也就是JVM内存管理体系结构的一个组成)

2:执行保存在方法区的字节码 (执行main()方法的字节码,)在执行时,持有指向Volcano类常量池的一个指针 (常量池:就是一个符号引用 如:Lava lava = new Lava()这句中的Lava就是一个符号引用)

3:JVM只在需要时才装载类(动态连接) 。JVM使用常量池指针找到第一项,发现是"Lava"字符串,检查方法区,发现Lava类并未被装载。


4:开始装载Volcano.class,同样,把读入的二进制数据中的类型信息放到方法区。

5:JVM用一个直接指向方法区Lava类数据的指针来替换常量池的第一项,也就是原先的“Lava”字符串。 这个过程就是所谓的:“常量池解析”---符号引用替换为直接引用。

6:JVM准备为新的Lava对象分配内存。分配对象当然需要类型信息,此时,用刚才替换的那个指针,也就是替换“Lava”字符串的那个指针(此时,这个指针指向方法区Lava类的数据)来访问Lava的类型信息(这个信息刚放到方法区)。找出其中记录的这样一个信息:需要分配多少内存。

7:确定内存要多大以后,在堆上分配内存,并初始化变量,包括超类的变量()。

8:把新生成的Lava对象引用压到Java栈中。到此,完成Lava lava = new Lava(); speed初始化为0。--这里speed为0,是指执行默认构造函数时,在这个过程中并未使用lava引用,而在第一次使用lava引用,不管是在lava的构造函数中,还是其他的类中引用lava时,它都在这个时刻正确初始化lava,给它赋值为5,

9:通过此时生成的Lava引用,把speed 初始化为正确的值 :5

10: 通过这个引用调用Flow()。

以上为我以一个例子来说明JVM 的一个实现执行Class的流程,欢迎大家阅读和提出意见.
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值