类加载的三个阶段
1.加载阶段
JVM在该阶段的主要目的是将字节码从不同的数据源转为二进制字节加载到内存中,并生成一个代表该类的java.lang.class对象
2. 连接
1.连接-验证
1.目的是为了确保Class文件的字节流包含的信息符合当前虚拟机的要求,并不会危害虚拟机自身的安全
2.文件格式的验证、元数据验证、字节码验证和符号引用验证
3.可以考虑使用-Xverify:one参数来关闭大部分的验证措施,缩短虚拟机类加载的时间
2.连接-准备阶段
JVM会在该阶段对静态资源变量,分配内存并默认初始化(对应的数据类型的默认初始化0,OL,null,false)
3.连接-解析
虚拟机将常量池内的符号引用替换为直接引用的过程
3.初始化
1.到初始化阶段,才是真正开始执行类中定义的java程序代码,此阶段是执行clinit()方法的过程
2.clinit()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量和静态代码块中的语句,
并合并
3.虚拟机会保证一个类的clinit()方法在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,
那么只会有一个线程去执行这个类的clinit()方法,其他的线程
都需要阻塞等待,指导clinit()方法完毕
类加载的三个阶段
最新推荐文章于 2023-12-03 23:13:49 发布