JVM——类加载时机与加载过程
简单说一些重点,详情请参考:JVM类生命周期概述
什么是类加载机制?
1、类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程。
类加载的时机是什么?虚拟机什么时候会加载Class文件并初始化类?
2、五种情况下类会进行初始化,这一过程发生在加载、验证、准备后,也就是说,初始化一个类前一定会先执行加载、验证、准备这三步操作(解析和初始化的顺序不定)
①遇到new,getstatic,putstatic或invokestatic这四条字节码指令,简单说:使用new实例化对象时,读取或设置一个类的静态字段时(被final修饰的放入常量池中的不算),调用一个类的静态方法时。
②使用反射调用时,若类没有初始化,先初始化。
③初始化一个类时,若其父类还未初始化,先初始化其父类。
④虚拟机启动时,先初始化主类(含有main()的那个类)
⑤java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。
有且只有这五种,然而对于JVM来说,不会触发初始化
的情况:
①通过子类引用父类的静态字段,不会导致子类初始化(静态字段在哪个类,哪个类才会初始化)
②通过数组定义来引用类,不会触发此类的初始化
③常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化
类的加载流程到底是怎样的?