java 类加载机制

JVM类加载过程:加载,验证,准备,解析,初始化,使用,卸载。

1、加载

加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。

2、验证

确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,例如JVM规范校验。

3、准备

为类变量分配内存并设置类变量的初始值阶段,其他的如类成员变量将不会进行初始化。如下

public static int num = 12306

此处的num将被赋值默认值0而不是12306,若是再加上final修饰则只将赋值,如

publib static final int num = 12306

此时类变量num将被直接赋值12306

4、解析

虚拟机将常量池中的符号引用替换为直接引用的过程。

5、初始化

该阶段开始执行自定义的java程序代码,JVM会根据语句执行顺序对类对象进行初始化。

以下几种情况不会执行类初始化:

  • 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
  • 定义对象数组,不会触发该类的初始化。
  • 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。
  • 通过类名获取Class对象,不会触发类的初始化。
  • 通过Class.forName加载指定类时,如果指定参数initialize为false时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。
  • 通过ClassLoader默认的loadClass方法,也不会触发初始化动作。

6、使用

从入口方法开始执行用户的程序代码。

7、卸载

程序执行完后,JVM开始销毁创建的Class对象,最后负责运行的JVM也退出内存。

原文地址:https://www.cnblogs.com/kingsonfu/p/10485102.html