Java类加载全过程
类加载全过程这个基础章节的博客也是很早之前就想做个总结的了,直奔主题 (1)加载 加载JAVA编译阶段后产生.class文件,里面有各种表,各种属性和方法描述。所以第一步进行的加载阶段,就是通过一个C++的instanceKlass加载器读取.class字节码文件,并且在元空间(方法区)生成一个.class类对象,它加载时会产生一个_JAVA_MIRROR镜像对象放在堆中。 (2)验证 校验类的字节码文件是否符合JVM虚拟机规范,比如检查头部的Cafe Babe 魔数。 (3)准备 准备阶段就是给static 静态变量分配内存空间,设置默认值,在初始化阶段才附值。 如果是static final +基本类型(int,long…) ,准备阶段分配空间同时附值。因为基本类型静态常量在编译期已经确定值,省去了初始化附值多此一举操作。 如果是static final +基本引用类型(对象,数组),则分配空间,不附值。因为new创建对象和附值操作都必须是在加载完成初始化阶段后。 (4)解析 将常量池(.class里面那个constant pool )中的符号引用(一个方法,类,属性的描述)转化成为直接引用(方法,类,属性值在内存中的真是地址,一般长“@1024a129493b11001c”大概这个样子)。 (5)初始化 调用生成的构造方法(< init >()v)对该加载的类进行初始化