再谈JVM中类的加载过程--加载

56 阅读2分钟

概述

在JVM的类加载阶段,通常可以分为3个宽泛意义上的加载过程,或者是5个略加细致化的加载过程。分别是加载->链接->初始化,加载->验证->准备->解析->初始化。

提前说明的一点

在实际进行类加载的时候,这些流程(后者那五个相对细致的流程)并不是严格按照串行的顺序进行执行的。

加载阶段

在这个阶段主要是完成了.class文件加载到内存中,同时在内存中构建出完整的.class对象的过程。展开如下

.class文件到字节流

首先JVM应该是读取到这个.class文件,并把这个文件内部的内容转化成字节流读取到JVM内部

将字节码填充到方法区

JVM会将字节码二进制数据流进行解析,将常量池,方法表,属性表等信息填充到方法区对应的类模板对象中 (可以这样想,既然是读到方法区,那么读取到了一定不是随便放到方法区的某一位置的,因此一定有一个固定填充位置,同时还读取到的类信息应该是和一个类相关联的,不能所有类的方法表都在一起,因此很自然引出了类模板对象的概念)

创建.class对象

JVM会根据在方法区中的类模板对象创建一个class类型的对象,显然这个类型的对象是存放在堆中的,因为这个对象也是引用类型,主要创建.class类型对象的时候,只能由JVM虚拟机进行创建。因此如果在代码中有这么一行代码的话

Class<Boy> c = Boy.class;

其实这里面有两个指向关系

  • 栈帧中的c指向堆中的.class对象
  • .class对象指向方法区中的类模板对象。

数组类型

通常来说,数组对象也是引用类型,但是数组对象不是类加载负责创建的,在创建时,JVM会循环去创建内部的各个元素。