概要:
在Java语言里面,类型的加载和链接过程都是再程序运行期间完成的,这样会再类加载时稍微增加一些性能开销,但是却能为Java应用程序提供高度的灵活性,Java中天
生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特点实现的。
类的生命周期:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)。
1。加载
1)通过一个类的全限定名来获取定义此类的二进制字节流。(并没有指明二进制流字符流要从Class文件中获取,为很多技术打下基础)
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。
2。验证
1)文件格式验证(验证字节流是否符合Class文件格式的规范)。
2)元数据验证(字节码描述的信息进行语义分析)。
3)字节码验证(数据流和控制流分析)。
4)符号引用验证(对类自身以外常量池中的各种符号引用的信息进行匹配性的校验)。
3。准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段。
这些内存都在方法区中进行分配,进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量。实例变量将会在实例化时随着对象一起分配在Java堆中。
4。解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。虚拟机的实现可以推迟解析这一步,它可以在当运行中的程序真正使用某个符号引用时再去解析它。
1)类或接口的解析
2)字段解析
3)类方法解析
5。初始化
“只有在首次主动使用时初始化”这个规则直接影响着转载,连接和初始化类的机制。在初始化阶段,则是根据程序员通过程序制定的主观计划去初始化类变量和其他资
源,或者说,初始化阶段是执行类构造器<clinit>()方法的过程。
1)如果类存在直接超类,且超类还没有被初始化,就先初始化直接超类。
2)如果类存在一个类初始化方法,就执行此方法。
6种主动使用:创建类的新实例,调用类中声明的静态方法,操作类或者接口中声明的非常量静态字段,调用Java API中特定的反射方法,初始化一个类的子类,指定一个
类作为Java虚拟机启动的初始化类。
6。卸载
被垃圾收集器回收。
参考:
《深入理解java虚拟机》
《深入Java虚拟机》