类加载的时机:类从被加载到虚拟机内存开始,到卸载为止,它的整个生命周期包括:加载(loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)7个阶段。其中验证,准备,解析3个部分统称为链接(Linking)。
有5种情况必须对类进行初始化,(加载,验证,准备在初始化之前)
1.遇到new对象,类的静态字段
2.对类进行反射调用
3.父类没初始化
4.虚拟机启动时用户需要指定一个要执行的主类
5.jdk1.7如果一个java.lang.invoke.MethodHandle实例解析结果REF_getStatic的方法句柄
加载:1.通过类的全限定名来获取定义此类的二进制字节流,2.将字节流所代表的静态存储结果转化为方法区的运行时数据
3.在内存中生成一个代表这个Class对象,作为方法区作为这个类的各种数据的访问入口。
验证:1. 验证时连接的第一个阶段保证Class文件字节流包含的信息符合当前虚拟机的要求,不会危害虚拟机自身的安全
(包括文件格式验证是否符合Class文件格式规范;元数据验证保证不存在不符合java语言规范的元数据信息;
字节码验证跳转指令正确,类型转化正确等;符号引用验证)
准备:正式为类变量分配内存并设置类变量初始值阶段,这时候内存分配仅包括被static修饰的变量不包括实例变量。
解析:虚拟机将常量池的符号引用替换为直接引用(可以直接指向目标的指针)类或接口解析,字段解析和类方法解析。
初始化:初始化5中情况
类加载器:启动类加载器C++实现,负责<JAVA_HOME>\lib 目录JVM识别的jar
扩展类加载器<JAVA_HOME>\lib\ext目录 类库
应用类加载器负责ClassPath上的类库