logo头像
ICQL

jvm_类加载机制

类加载机制

虚拟机将 描述类的字节码数据 加载到内存中,对其进行一些处理转换为虚拟机可以直接使用的java类型

类加载的时机

类的生命周期:加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化 -> 使用 -> 卸载

java虚拟机规范没有强制规定什么时候执行类的加载

jvm进程启动时会加载jre下的部分类,其他类一般是在运行期间用到了才会去加载

打印类加载日志参数:-XX:+TraceClassLoading
类加载的时机

类加载的过程

1)加载 Loading

加载步骤

  • 通过 类的完全限定名 找到 描述类的字节码数据 加载到内存中
  • 将其转换为方法区的运行时数据结构
  • 在内存中生成一个代表这个类的 java.lang.Class对象,作为对方法区数据结构访问的入口
  • 非数组类型

    可控性比较高,可以直接使用系统类加载器加载,也可以自定义类加载器进行加载
    类唯一性 = 类加载器 + 类的完全限定名

  • 数组类型

    数组类型本身由java虚拟机直接创建

    数组元素类型

    • 引用类型:类唯一性 = 数组元素类型的类加载器 + 数组类型的完全限定名
    • 基本类型:类唯一性 = Bootstrap类加载器 + 数组类型的完全限定名

2)验证 Verification

验证字节码数据是否符合当前虚拟机的要求

3)准备 Preparation

为类变量(static修饰)分配内存且初始化默认值

static:初始化为零值
static final:直接初始化为此字段的值(TODO)

4)解析 Resolution:此阶段发生时间不定

5)初始化 Initialization:(初始化之前必须要 加载-验证-准备)

6)使用 Using

7)卸载 Unloading

微信打赏

赞赏是不耍流氓的鼓励