JVM——类的加载机制

目录

类的加载原理:

类的加载过程:(类的生命周期)

双亲委派机制:

类的加载原理:

JVM将class字节码加载到内存中,将这些静态数据转换成方法区中的运行时数据结构。在堆中生成Class类的对象,作为方法区的类数据的访问入口。JVM内部组成

Java中默认的类加载器:

 

类的加载过程:(类的生命周期)

JVM类加载机制分成了五步:加载,验证,准备,解析,初始化。

一、加载:主要由类加载器完成

  • 通过类名获取定义此类的二进制字节流
  • 将这个类字节流的静态存储结构转换成方法区中的运行时数据结构
  • 在堆中生成一个代表此类的java.lang.Class对象,作文方法区类数据的访问入口

二、验证:用于确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危机虚拟机的自身安全。

  • 文件格式验证     基于字节流
  • 元数据验证         基于方法区的存储结构验证
  • 字节码验证         基于方法区的存储结构验证
  • 符号引用验证     基于方法区的存储结构验证

三、准备:  为类变量(也叫静态变量)分配内存空间,并将其初始化为默认值(此阶段只是默认值,只有在初始化时候才会变量赋值)

四、解析:把类型中的符号引用转换为直接引用

  • 类或接口解析
  • 字段解析
  • 类方法解析
  • 接口方法解析

五、初始化:执行类的构造器client方法的过程,client方法是由编译器自动收集类中的 静态变量 赋值操作和 静态语句 块中的语句合并而成的。

主要完成静态块执行与静态变量的赋值,若被加载类的父类没有初始化,则先对父类进行初始化。

只有对类主动使用时,才会进行初始化,初始化的触发条件

  1. 创建类的实例时
  2. 访问类的静态方法或者静态变量时
  3. Class.forName() 反射类时
  4. 某个子类被初始化时

初始化顺序

  1. 父类的静态变量
  2. 父类的静态代码块
  3. 子类的静态变量
  4. 子类的静态代码块

------------------------------- 以下两步属于类的生命周期-------------------------------

六、使用类:

实例化:指的是创建对象的过程,这个过程会在堆中申请一块内存,用来存储非静态变量,非静态方法。
实例化子类的时候,会先执行父类的构造函数,但并不是在实例化父类,只是在对变量进行复制。继承相关面试题

this() 子类构造函数,this.a 子类的成员变量(类变量,成员变量,局部变量)
super() 父类的无参构造函数,super.a 父类的成员变量

实例化顺序:

  1. 父类的非静态变量
  2. 父类的非静态代码块
  3. 父类的构造方法
  4. 子类的非静态变量
  5. 子类的非静态代码块
  6. 子类的构造方法

七、卸载类:

由 Java 虚拟机自带的三种类加载器加载的类在虚拟机的整个生命周期中是不会被卸载的,只有用户自定义的类加载器所加载的类才可以被卸载。

双亲委派机制:

如果一个类加载器收到了一个类加载器请求,他首先不会自己去尝试加载这个类,而是将这个请求委派给父加载器去完成,每一个层级都将请求这样向上传递。因此所有的加载请求都会传到启动类加载器中。如果父类反应自己无法加载这个类,子类才会去尝试对该类进行加载。

这样使得所有的java类随着他的加载器一起具有一种带有优先级层次结构。

参考文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值