zoukankan      html  css  js  c++  java
  • 【Java】类加载过程

    JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的Java类型的过程。

    类加载的过程主要分为三个部分:

    • 加载

    • 链接

    • 初始化

    而链接又可以细分为三个小部分:

    • 验证

    • 准备

    • 解析

    1、加载

    简单来说,加载指的是把class字节码文件从各个来源通过类加载器装载入内存中。

    将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。

    (2)链接 将java类的二进制代码合并到jvm的运行状态之中的过程

    2、链接

    2.1 验证

    确保加载的类信息符合jvm规范,没有安全方面的问题。

    1. 对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?
    2. 对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?
    3. 对于字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。
    4. 对于符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?

    2.2 准备 

    正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。

    特别需要注意,初值,不是代码中具体写的初始化的值,而是Java虚拟机根据不同变量类型的默认初始值。

    比如8种基本类型的初值,默认为0;引用类型的初值则为null;常量的初值即为代码中设置的值,final static tmp = 456, 那么该阶段tmp的初值就是456

    2.3 解析

    虚拟机常量池内的符号引用替换为直接引用的过程。

    (比如String s ="aaa",转化为 s的地址指向“aaa”的地址)

    (3)初始化

    这个阶段主要是对类变量初始化,是执行类构造器的过程。

    换句话说,只对static修饰的变量或语句进行初始化。

    如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。

    如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

    当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。

    参考链接:https://blog.csdn.net/ln152315/article/details/79223441

  • 相关阅读:
    CodeForces-1263D Secret Passwords 并查集 求连通分量
    Virtual Friends HDU
    AreYouBusy HDU
    Jack Straws POJ
    Divisibility by 25 CodeForces
    逃离迷宫 HDU
    Find a way HDU
    Stall Reservations POJ
    Three displays CodeForces
    Radar Installation POJ
  • 原文地址:https://www.cnblogs.com/zeze/p/9608706.html
Copyright © 2011-2022 走看看