深入理解jvm --第七章 虚拟机类加载机制

类生命周期

 

  1. 类加载过程

加载

过程

获取定义类的二进制字节流

获取方式

zip包

网络

运算时生成

其他文件生成

数据库

将字节流转化为方法区的运行时数据结构

在内存中生成一个代表该类的java.lang.Class对象

连接

验证

文件格式验证

元数据验证

字节码验证

符号引用验证

准备

为类变量分配内存并赋初0值

解析

将符号引用替换为直接引用

类或接口解析

不是数组类型传递全限定名用类加载器加载

时数组类型且元素为对象,按上一步加载元素类型

符号引用验证

字段解析

class_index符号引用解析

所在类包含简单名称和字段描述符匹配的字段,返回该字段直接引用

若有接口,从下往上搜索接口,若接口中包含匹配字段则返回匹配的直接引用

若不是java.lang.Object,从下往上搜索父类,若有匹配字段则返回字节引用

查找失败

类方法解析

class_index符号引用解析

解析结果是接口抛异常

在类中查找是否有匹配方法,有则返回

在父类中查找是否有匹配方法,有则返回

在接口列表及它们父接口中查找是否有匹配方法,有则返回

失败

接口方法解析

class_index符号引用解析

解析结果是类,抛异常

在本接口中查找是否有匹配方法,有则返回

在父接口中查找是否有匹配方法,有则返回

失败

初始化

时机

遇到new,getstatic,putstatic或invokestatic指令

使用java.lang.reflect包的方法对类反射调用

子类要先触发父类的初始化

用户指定要执行的主类

使用动态语言支持时的一些情况

过程

执行类构造器的<clinit>()方法

<clinit>()方法

产生

类变量的赋值动作

静态语句块

与构造函数区别

不需要显式调用父类构造器,虚拟机保证父类的<clinit>()方法在子类之前执行

第一个被执行<clinit>()方法的是java.lang.Object类

类可能不被生成<clinit>()方法

接口中也会生成<clinit>()方法,但不需要先执行父接口的<clinit>()方法

<clinit>()方法会被自动同步执行

  1. 其他

使用

卸载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值