jvm 类加载过程和双亲委派机制以及打破双亲委派机制

2020-04-05  本文已影响0人  邵红晓

jvm类的加载机制

1.加载
通过全限定类名来获取class的字节流,存储到元空间中,并且定义class对象,作为该类的访问入口
2.连接
a.验证(确保被加载的类符合jvm的规范) b. 准备(类变量分配初始值int i =0,int j=0 obj=null) c.解析 (常量池中的符号引用替换为直接引用,在sysout,s变为“abc”)

public class Test{
   public static void main() {
     String s=”adc”;
     System.out.println(“s=”+s);
   }
}

3.初始化
a.clinit 类初始化
类变量(静态域)赋值初始化过程,其实是执行类变量代码赋值过程以及执行静态代码块中的逻辑,从上到下执行,int i = 20; int j = 20,obj = Object ,同时虚拟机会保证多线程初始化类的时候被正确的加锁和同步,,注意使用单例的懒汉模式过程中,要加volatile,防止指令重排序,出现返回null的空情况
b.init对象初始化
执行类构造函数
4.使用
5.卸载

类的加载时机

1.主动引用
new,main方法,反射,初始化类的时候,父类没有初始化,调用类的静态成员(final常量除外) 等情况,类需要被先初始化
2.被动引用
通过子类引用父类的静态变量,不会导致子类初始化,而是会导致父类初始化
引用常量池中的常量
通过数组定义类的引用,不会导致类被初始化

双亲委派机制

打破双亲委派机制

image.png

参考
https://www.cnblogs.com/czwbig/p/11127222.html
https://blog.csdn.net/yangcheng33/article/details/52631940

上一篇 下一篇

猜你喜欢

热点阅读