java生命周期
上周学习整理到加载,今天继续看链接,链接分为验证,准备,解析。
验证
验证的目的是保证⼆进制字节流中的信息符合虚拟机规范,有没有安全问题。
java是个相对安全的语言,但是编译器和虚拟机是两个独⽴的东⻄,虚拟机只认⼆进制字节流,它不会管所获得的⼆进制字节流是哪来的。当然,如果是编译器给它的,那么就相对安全,但如果是从其它途径获得的,⽆法确保该⼆进制字节流是安全的。那么,所以验证还是有必要的,但也不是必须的。所以验证是一个重要但不必要的过程。
验证包含文件格式验证、元数据验证、字节码验证、符号引用验证
验证是一个相对耗时的过程,当所运行的代码如果反复使用和验证过,可以使用-Xverify:none 参数关闭,可以缩短加载时间。
准备
该过程做jvm两件事情
1:为已在⽅法区中的类的静态成员变量分配内存
2:为静态成员变量设置初始值,初始值为0、false、null等
八大基本类型默认值
解析
解析是虚拟机将常量池的符号引⽤替换为直接引⽤的过程。主要针对类或接⼝、字段、类⽅法、接⼝⽅法四类符号引⽤进⾏,分别对应于常量池中的CONSTANT_Class_info 、CONSTANT_Fieldref_info 、CONSTANT_Methodref_info 、CONSTANT_InterfaceMethodref_info`四种常量类型。
三个合称为链接
初始化
初始化是类加载过程的最后⼀步,到了此阶段,才真正开始执⾏类中定义的Java程序代码(初始化成为代码设定的默认值)。在准备阶段,类变量已经被赋过⼀次系统要求的初始值,⽽在初始化阶段,则是根据程序员通过程序指定的主观计划去初始化类变量和其他资源,或者可以从另⼀个⻆度来表达:初始化阶段是执⾏类构造器()⽅法的过程。
简单说来讲初始化过程就是调⽤类初始化⽅法的过程,完成对static修饰的类变量的⼿动赋值还有主动调⽤静态代码块。
使用
包含主动使用和被动使用,直接使用:如new对象,类的静态变量,静态方法;main方法,初始化子类方法会触发父类方法初始化。也就是说直接使用会引起类的初始化。
被动使用:类的常量,定义类的数组等。
卸载
类的所有实例都已经被回收,加载该类的classLoader也被回收,然后类对应的java.lang.Class对象没有任何地方被引用。满足后就会被卸载。