1、类的加载过程
一个类从加载到使用,一般会经历:加载——》验证——》准备——》解析——》初始化——》使用——》卸载
加载做的事情
根据类的全限定名获取其定义的二进制流文件——》将流代表的静态存储结构转化为方法区运行时的数据结构——》在队生成一个这个类的Class对象,作为方法区的入口。
加载涉及到类加载器:BootStrap类加载器-》Extension类加载器-》Application类加载器-》自定义类加载器
验证做的事情
文件格式的验证(字节流文件是否符合class规范)——》元数据验证(字节码的描述信息是否符合java规范)——》字节码的验证(分析数据流和控制流,确保被校验类的方法不危害虚拟机)——》符号引用验证(类自身以外的(如常量池的符号引用)信息进行匹配校验)
准备做的事情
为类变量(static修饰)分配内存并设置类变量的初始值,这些内存都分配在方法区(元数据)中。基本类型赋值为初始值(如int 为0),引用类型的赋值为null。final修饰的变量直接赋值为真实的值。
解析做的事情
将常量池中的符号引用替换为直接引用。主要为:类或接口解析、类方法解析、字段解析、接口方法解析。
初始化做的事情
为static修饰的类变量赋值为真实值,加载static修饰的代码块,加载构造函数,父类初始化等