JVM类加载机制

7 篇文章 0 订阅

JVM类加载机制

​ JVM中的类记载分为5个阶段:加载、验证、准备、解析、初始化,在类初始化完成后就可以使用该类的信息。

1.加载

​ 指的JVM读取Class文件,并根据Class文件描述创建java.lang.Class对象的过程,类加载过程主要包含将Class文件读取到运行时内存区域的方法区内、在堆中创建java.lang.Class对象,并封装类在方法去的数据结构的过程,再读取Class文件时既可以通过文件的形式读取,也可以根据jar包、war包读取,还可以通过代理自动生成Class或其他方式读取。

2.验证

​ 主要用于保证Class文件是否符合当前虚拟机的需求,保障虚拟机自身的安全,只有通过验证的Class文件才能被JVM加载

3.准备

主要工作实在方法区中为类变量分配内存空间并设置类中的变量的初始值,如果变量被静态修饰那么会在初始化后修饰,因为jvm静态变量的初始化操作是动议在构造器中,如果被final修饰,则JVM在编译阶段后会为final类型的变量id生成对应ConstantValue属性,虚拟机会在准备阶段会根据ConstantValue属性将final类型的变量设置值。

private static int id = 10086;

以上代码静态变量在准备阶段的初始化值是0,将id设置为10086的动作是在对象初始化时候完成的,因为JVM在编译阶段会将静态变量的初始化操作定义在构造器中。

private static final int id = 10086;

如果为final类型,则JVM在编译姐u但后会为final类型的变量id生成其对应的呃ConstatnValue属性,虚拟机在准备阶段会根据ConstantValue属性赋值为10086;

4.解析

​ JVM会将常量池中的符号引用替换为直接引用

5.初始化

​ 主要通过类构造器方法为类进行初始化。方法是在编译阶段由编译器自动收集类中静态语句块和变量的复制操作组成。JVM规定只有父类的方法执行成功后,子类中的方法才可以被执行,如果此类有实现接口那么接口的执行后此类的方法才会被执行,在一个类中既没有静态变量赋值操作也没有静态语句块的时,编译器不会为该欸执行方法。

​ 一下几种情况JVM不会执行初始化流程

​ a. 常量在编译时会将其常量值存入使用该常量的类的常量池中,该过程不需要调用常量所在的类,因此不会触发该常量类的初始化

​ b. 在子类调用父类的静态字段,不会触发子类的初始化,只会触发父类的初始化

​ c. 定义对象数组,不会触发该类的初始化,

​ d. 在使用类名获取Class对象不会触发类的初始化

​ e. 在使用Class.forName加载指定的类时,可以通过initialize参数设置是否需要对类进行初始化

’ f. 在使用ClassLoder默认的loderclass方法加载类时不会触发该类的初始化

类加载器

​ JVM提供了三种类加载器,分别是启动类加载器(BootStrap ClassLoader)、扩展类加载器(Extention ClassLoader)和应用程序类加载器(Application ClassLoader)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w2LuHMPz-1655197405256)(https://dazuiblog.oss-cn-hangzhou.aliyuncs.com/article/public/image/asdqdqsdqsdqsdq%20(2)].png)

启动器加载器:负责加载JAVA_HOME\lib目录下的类库

扩展类加载器:负责加载JAVA_HOME\lib\ext目录中的类库

应用程序加载器:负责加载用户路径(classpath)上的类库

除了上述描述的3中类记载其,我们还可以通过继承java.lang.ClassLoader实现自定义的类加载器。

双亲委派

JVM会通过双拼委派对类进行加载,

​ 首先不考虑我们自定义的加载类,首先会在AppClassLoader中检查是否被加载过,如果被加载过那么就返回,没有就向上委托到ExtClassLoader同理也是检查下是否被加载,如果没有被加载就去BootStrapClassLoader同样查看是否被加载,如果没有被加载就去他的加载路径中去查找,查到了就返回,如果没有查找到就继续向下查找ExtClassLoader,ExtClassLoader会去他自己对应的路径查找,如果查找到了就返回没有查找到就去AppClassLoader查询,如果查找了就返回

​ 如果有自定义加载器就从自定义加载器开始向上委托,他的上面是AppClassLoader。但是向下的查找的时候要查找到自定义加载器

双拼委派的核心就是保障类的唯一性和安全性。

OSGI

​ OSGI是Java动态化模块化系统的一系列规范,基于OSGI的程序可以实现模块级别的热拔功能,在系统升级更新时,可以只针对需要更新的程序进行停用和重新安全,极大提高了系统升级的安全性和便捷性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值