加载--连接(验证、准备、解析)---初始化----使用---卸载
当且仅当5中情况 "初始化": 比如new关键字、反射、初始化一个类时父类未初始化,则初始化父类、main方法的类,JDK1.7时 methodHandle方法。
加载:
加载做了三件事:
1、通过一个类的全限定名来获取定义此类的二进制字节流
2、讲这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表着各类的java.lang.Class对象,作为方法区的这个类的各种数据的访问入口
验证:
文件格式验证、元数据验证、字节码验证、符号引用验证
准备:
正式为类变量分配内存并设置变量初始值。这些变量使用的内存都将在方法区中进行分配
public static int value = 123;
类变量指静态变量,准备阶段会给value设置 0 ,赋值为123是在初始化阶段才会执行
解析:
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
初始化:
真正执行JAVA代码,,,<clinit>()方法由编译器 自动收集类中所有类变量的赋值动作和静态语句块(static{})语句合并产生 .收集顺序由出现顺序决定。