# 一张图详解jvm内存中类加载机制
###一、类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: ![这里写图片描述](https://img-blog.csdn.net/20180809093827343?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25ld2JpZV85MDc0ODY4NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
###二、过程解析
####1、加载:
- 通过类的全限定名获取这个类的二进制字节流。
- 将这个字节流所代表的静态存储结构转换为方法区运行时结构。
- 在内存里面生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问入口。
####2、验证
- 为了确保class文件的字节流信息符合当前虚拟机的要求进行验证。
- 文件格式验证:验证字节流是否符合class文件格式规范。
- 元数据验证:对字节码描述的信息进行语义分析。
- 字节码验证:通过数据流、控制流分析,确定程序的语义、语法是符合逻辑的。
- 符号引用验证:发在虚拟机将符号引用转化为直接引用的时候。
####3、准备
- 准备阶段是正式为类变量分配内存并设置变量初始值的阶段,主要针对静态变量。
####4、解析
- 虚拟机将常量池内的符号引用并替换为直接引用的过程。
####5、初始化
- 类初始化阶段是类加载过程中的最后一步,在准备阶段,变量已经赋值过一次系统要求的初始值,而在初始化阶段,根据程序员通过程序制定的主观计划去初始化类变量及其他资源。
![](https://i-blog.csdnimg.cn/blog_migrate/07df64cf5f8739d9e4ee18585da0bd9c.jpeg)