JVM 类加载过程

以下内容摘抄自周志明的《深入理解 Java 虚拟机》,自己也似懂非懂,仅仅是做个总结。

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

2. 验证。
    1). 文件格式验证;
    2). 元数据验证;
    3). 字节码验证;
    4). 符号引用验证。

3. 准备。
    为类变量赋零值,或 ConstantValue 的值。

4. 解析。
    把常量池中的符号引用翻译为直接引用(指针)。
    1). 类或接口的解析:解析常量池中全部的 CONSTANT_Class_info ;
    2). 字段解析:解析常量池中全部的 CONSTANT_FieldRef_info ;
    3). 类方法解析:解析常量池中全部的 CONSTANT_MethodRef_info ;
    4). 接口方法解析:解析常量池中全部的 CONSTANT_InterfaceMethodRef_info 。

5. 初始化。
    有且仅有以下5种情况会触发类的初始化:
    1). 遇到 new 、 getstatic 、 putstatic 、 invokestatic 这4条字节码指令时;
    2). 使用 java.lang.reflect 包对类进行反射调用时;
    3). 初始化一个类的时候,发现其父类还没有进行初始化;
    4). 虚拟机启动时的主类;
    5). 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandler 实例最后的解析结果为 REF_getStatic 、 REF_putStatic 或者 REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行初始化。

猜你喜欢

转载自dsxwjhf.iteye.com/blog/2201695