JVM 类加载机制/类加载器

类加载机制/类加载器

类声明周期
在这里插入图片描述

验证阶段

文件格式验证: 基于二进制流,只有这一步是基于二进制流,后续步骤都是基于方法区数据

1.魔数: cafe babe 开头
2.主次版本是否在当前JVM支持范围
3.常量池的常量是否不被支持
4.....很多很多规范

元数据验证

1.类是否有父类,(Object)
2.匪类是否继承了被final修饰的类
3......各种其他验证

字节码验证

符号引用验证

准备阶段

准备静态变量值

解析阶段

JVM将常量池内的符号引用替换为直接引用的过程
	1.类/接口解析
	2.字段
	3.方法
	4.....

初始化阶段

 (-XX:+TraceClassLoading 观察类加载情况)
1.使用new,getstatic,putstatic,invokestatic 这4个命令(jvm命令,在class反汇编后看到)时 
2.new一个对象
3.读取或设置一个类静态字段
4.调用一个类的静态方法
5.反射reflect
6.初始化类时,要先触发父类的初始化
7.如果通过子类来访问父类的静态变量,则只会触发父类的初始化,子类的加载
8.定义一个类的数组,不会触发初始化, 会触发父类加载,不会触发子类加载
9.XX类打印XX2类常量不会触发XX2的初始化(在编译时,该常量写入了XX类的常量池中)
10.打印一个常量,该常量引用了另外一个常量,此时会触发初始化

-jvm会先初始化执行main方法的主类
-1.7后加入的动态语言支持, MethodHandle 最后解析结果REF_getStatic,REF_putStatic....
-1.8后加入的default方法,接口实现类初始化

=======================

在这里插入图片描述

类加载器

三层类加载器

1.启动类加载器 Bootstrap Class Loader
2.扩展类加载器 Extension Class Loader
3.应用程序加载器 Application Class Loader

双亲委派模型
在这里插入图片描述
双亲委派模型的好处

 类加载唯一,稳定

Tomcat 打破双亲委派模型,为了应用隔离
在这里插入图片描述

SPI

1.META-INF/services/xxxxx
2.例子JDBC, dubbo
3.线程的上下文类加载器
4.破坏双亲委派模型
5.基于接口编程+使用策略模式

在这里插入图片描述

OSGI做一下了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值