Java 类加载过程

2018-12-21  本文已影响12人  谷哥得小弟

java类被加载到JVM虚拟机开始到卸载出内存,类经历了7个声明周期:加载———验证——准备——解析——初始化——使用——卸载,如下图所示:

类加载周期.png

上述过程,除了解析外,其他过程都是按顺序的开始,但在运行过程中他们是交叉运行的,因为前一个过程会在运行中去开启后一个过程,不用等待到已经完成;然而解析过程是可能在初始化之后执行的,未来支持Java语言的运行时绑定

类加载过程:
加载
 1、通过一个类的全限定名来获取定义此类的二进制字节流。
 2、将这个字节流所代表的静态储存结构转化为方法区的运行时数据结构。
 3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口的外部接口。

接下来介绍连接阶段的三个过程:
验证
文件格式验证
元数据验证
字节码验证
符号引用验证

准备
 这个阶段是正式为类变量分配内存并设置类变量初始值的阶段。这个阶段被分配的变量仅包括类变量,而不包括实例变量。实例变量将会在对象实例化时随着对象一起分配到java堆中,如:

public static int value=123;

 变量value在准备阶段后的初始值是0而不是123,而实例初始化必须等到初始化阶段。也有 “特殊的情况”,如果有类字段属性constantVaule,那么在准备阶段虚拟机就会value赋值为constantVaule属性指定的值123。如下:

public static final int value=123;

解析
 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

   符号引用
一种用一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要能够在使用时无歧义的定位到目标即可。这种虚拟机实现的内存布局可以各不相同,但是他们能接受的符号引用必须都是一致的。因为符号引用的字面量形式明确定义在java虚拟机规范的Class文件格式中。

   直接引用
直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用和虚拟机实现的内存布局是相关的,同一个符号引用在不同的虚拟机上实例上翻译出来的直接引用一般会不同。如果有直接引用,那么引用的目标必定已经在内存中存在。

  解析动作主要针对类或者接口、字段、类方法、方法类型、方法句柄和调用点限定符 7类符号引用进行。

初始化
类初始化时类加载过程的最后一步,到了这个阶段,才开始真正执行类中定义的java程序代码。

上一篇 下一篇

猜你喜欢

热点阅读