![](https://csdnimg.cn/release/download_crawler_static/88063584/bgd.jpg)
1)验证:确保被加载类的正确性。验证就是把刚才读到内存里的东西进行一个
校验, 主要是验证一下刚才读到的这个内容是不是一个合法的 .class 文件,
必须是编译器生成的 .class 文件才能通过验证, 如果我们随便创建一个后缀
名为 .class 文件是不能通过验证的; 并且这里除了验证文件格式之外,也会验
证一下文件里面的一些字节码指令(方法里面具体要执行的指令)是否正确. 总
之, 验证选项可以是文件格式验证, 字节码验证, 符号引用验证等;
2)准备:为类的静态变量分配内存,并将其初始化为默认值。这里的准备阶段
其实就是为了类对象中的一些成员分配内存空间, 并且进行一个初步的初始化
操作, 也就是把初始空间设为全 0; 例如:
类似于这句代码初始化 value 的 int 值为 0,而不是 111;
3)解析:把类中的符号引用转换为直接引用。解析操作主要是针对字符串进行
的处理, .class 文件中会涉及到一些字符串常量, 在这个类加载的过程中, 就
需要把这些字符串常量给替换成当前 JVM 内部已经持有的字符串常量的地址.
也可以说解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过
程, 也就是初始化常量的过程. 这里需要注意的是: 并不是程序一启动, 就立
即把所有的类都给加载了, 而是用到哪个类就加载哪个类,但是呢,字符串常量
池是最初启动 JVM 就有的, 存在于堆中;
3.初始化:给类的静态变量赋予正确的初始值。这里的初始化才是对静态变量
进行初始化, 同时也会执行 上面代码中 static 代码块. 也就是说 Java 虚拟
机真正开始执行类中编写的 Java 程序代码, 将主导权移交给应用程序,初始化
阶段就是执行类构造器方法的过程;
4.使用:到这里其实已经加载完成了;
5.卸载:当代表一个类的 Class 对象不再被引用,那么 Class 对象的生命周期
就结束了,对应的在方法区中的数据也会被卸载。
JVM 中的 Class 只有满足以下三个条件,才能被 GC 回收,也就是该 Class 被卸
载(unload):
1)该类所有的实例都已经被 GC,也就是 JVM 中不存在该 Class 的任何实例;
2)加载该类的 ClassLoader 已经被 GC;
3)该类的 java.lang.Class 对象没有在任何地方被引用。
类加载器有哪些?
� 启动类加载器(BootstrapClassLoader):负责加载存放在 <JAVA_HOME>\lib
下,或被 -Xbootclasspath 参数指定的路径中的,并且能被虚拟机识别的类库
(如 rt.jar,所有的 java.开头的类均被 BootstrapClassLoader 加载)。启
动类加载器是无法被 Java 程序直接引用的。
� 扩展类加载器(ExtensionClassLoader):它负责加载 <JAVA_HOME>\lib\ext
目录中,或者由 java.ext.dirs 系统变量指定的路径中的所有类库(如 javax.
开头的类),开发者可以直接使用扩展类加载器。