虚拟机类加载机制

2020-02-16  本文已影响0人  官子寒

1. 概述

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换和解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是类加载机制

2. 类加载的时机

类加载的时机

初始化的四种情况:

注意

  1. 对于静态字段,只有直接定义这个字段的类才会被初始化
  2. 通过数组类定义引用类,不会导致引用类的初始化
  3. 常量直接进入常量池,因此本质上不会引用类,不会导致初始化

3. 类加载的过程

3.1 加载

分为3个步骤

加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区的数据存储格式由虚拟机自己定义,虚拟机规范未规定此区域的具体数据结构。然后在Java堆中实例化一个java.lang.Class的对象,这个对象将作为程序访问方法区中的哲学类型数据的外部接口

3.2 验证

验证是连接的第一个阶段,目的是为了保证Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全

包括4个阶段:

3.3 准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都主要在方法区进行

赋零值

public static int value = 123;

赋值123,因为value直接进入方法区的常量池,在其中二进制流中有存储ConstantValue属性,所以在会在准备阶段就被初始化为该值

public static final int value = 123;

3.4 解析

解析阶段就是将符号引用转化为直接引用的过程

3.5 初始化

类加载过程的最后一步,会开始真正执行类中定义的Java字节码。而之前的类加载过程中,除了在『加载』阶段用户应用程序可通过自定义类加载器参与之外,其余阶段均由虚拟机主导和控制。

<clinit>()方法执行的细节:

4. 类加载器

只用于实现类的加载动作,但在程序中的作用远不止于类加载阶段

判定类:类Class文件是否相同 + 类加载器是否相同

4.1 类加载器分类

类加载器:

  1. 启动类加载器
  1. 扩展类加载器
  1. 应用程序类加载器

4.2 双亲委派模型

java编译期和运行期
class对象的加载

上一篇下一篇

猜你喜欢

热点阅读