文章目录

  • 类加载过程
  • 1、加载
  • 2、连接
  • 2.1、验证
  • 2.2、准备
  • 2.3、解析
  • 3、初始化


类加载过程

 当我们写好.java源文件后,JDK中的java编译器 javac 会帮我们把 .java 源文件编译成 .class 的字节码文件。当程序需要用到某个类时,那个类就会被加载进内存。

1、加载

  • 通过类的全限定名,获取定义此类的二进制字节流。
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  • 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法去这个类的各种数据的访问入口。

(PS:摘自周志明老师的《深入理解Java虚拟机》)

我总结一下:就是我们本地的.class字节码文件它需要通过字节流的方式传输给JVM,然后JVM会把获取的字节流转化成方法区(1.7是永久代,1.8是元空间)运行时类的数据结构,因为类的信息是存在方法区的。最后会在内存生成这个类的Class对象,作为访问这个类的入口,可以通过反射操作这个Class类。

2、连接

2.1、验证

 验证的目的是确保Class文件的各种信息符合Java虚拟机的规范。有文件格式验证、元数据验证、字节码验证、符号引用验证。

2.2、准备

 准备的目的是为类的静态变量分配内存并设置初始值,比如 private static int a;在这个阶段就会分配到内存,并且获得默认初始值 0。

2.3、解析

 解析阶段会把常量池内的符号引用替换为直接引用。注意:这里的常量池是指class文件的常量池。
主要包括:

  • 类或接口的解析
  • 字段解析
  • 方法解析
  • 接口方法解析

3、初始化

 进行准备阶段时,变量已经赋过一次初始值了,在初始化阶段,则会根据程序员通过编码制定的主观计划去初始化类变量和其他资源。初始化阶段其实就是执行构造器()方法的过程。
(参考《深入理解Java虚拟机》)