8.类加载各阶段的作⽤分别是什么?
-
加载 在加载阶段,虚拟机需要完成以下三件事情: 1、通过⼀个类的全限定名来获取定义此类的⼆进制字节流; 2、 将这个字节流所代表的静态存储结构转化为⽅法区的运⾏时数据结构; 3、在内存中⽣成⼀个代表这个类的 java.lang.Class 对象,作为⽅法区这个类的各种数据的访问接⼝。
-
验证 主要是为了确保 Class ⽂件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机⾃身的安全。验证 阶段⼤致上分为 4 个阶段的检验动作:⽂件格式验证、元数据验证、字节码验证、符号引⽤验证。
(1)⽂件格式校验:验证字节流是否符合 class ⽂件的规范,并且能被当前版本的虚拟机处理。只有通过这个阶段 的验证后,字节流才会进⼊内存的⽅法区进⾏存储,所以后⾯的3个阶段的全部是基于⽅法区的存储结构进⾏的, 不会再直接操作字节流;
(2) 元数据验证:对字节码描述的信息进⾏语义分析,以保证其描述的信息符合 Java 语⾔规范的要求。⽬的是保证 不存在不符合 Java 语⾔规范的元数据信息;
(3)字节码验证:该阶段主要⼯作是进⾏数据流和控制流分析,保证被校验类的⽅法在运⾏时不会做出危害虚拟机 安全的⾏为;
(4) 符号引⽤验证:最后⼀个阶段的校验发⽣在虚拟机将符号引⽤转化为直接引⽤的时候,这个转化动作将在连接 的第三个阶段——解析阶段中发⽣。符号引⽤验证的⽬的是确保解析动作能正常执⾏。
-
准备 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使⽤的内存都将在⽅法区中进⾏分配 **。这时候进⾏内存分配的仅包括类变量(被 static 修饰的变量),⽽不包括实例变量,实例变量将会在对象实例 化时随着对象⼀起分配在 Java 堆中。实例化不是类加载的⼀个过程,类加载发⽣在所有实例化操作之前,并且类 加载只进⾏⼀次,实例化可以进⾏多次。 初始值是默认值 0 或 false 或 null。如果类变量是常量(final),那么会按照表达式来进⾏初始化,⽽不是赋值为 0。public static final int value = 123;
-
解析 解析阶段是虚拟机将常量池内的符号引⽤替换为直接引⽤的过程。
-
初始化 在准备阶段,变量已经赋过⼀次系统要求的初始值了,⽽在初始化阶段,则根据程序员通过程序制定的主观计划去 初始化类变量和其他资源,或者可以从另外⼀个⻆度来表达:初始化阶段是执⾏类构造器 () ⽅法的过程。

浙公网安备 33010602011771号