《深入理解Java虚拟机》-类加载机制
2016-10-06 本文已影响163人
gatsby_dhn
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。这里说的class文件可以是任何符合class文件格式的二进制字节流。
类加载时机
虚拟机严格规定了以下情况必须对类进行加载:
1.遇到new关键字,读取或设置类的静态字段,调用类的静态方法
2.对类进行反射调用时,如果类没有进行初始化,则先触发初始化
3.初始化类时先初始化父类
4.虚拟机启动时,必须先初始化主类
类加载过程
加载-->验证-->准备-->解析-->初始化-->使用-->卸载
加载
当类加载时机成熟,会将class字节流加载到内存方法区,形成适当的数据结构。具体完成以下3件事:
1.通过类的全局限定名获取定义此类的二进制字节流
2.将代表这个字节流的静态存储结构转化为方法区的运行时数据结构
3.在内存中(HotSpot虚拟机实现中在方法区)生成一个代表这个类的java.lang.Class对象,作为方法区这个类的访问入口。
验证
验证阶段确保二进制字节流包含的信息符合虚拟机的要求,不会对虚拟机造成危害。
准备
该阶段为类变量分配内存并设置类变量的初始值。比如public static int value = 11
,这个阶段过后value这个初始值为0。引用变量的值设置为null。
解析
将符号引用(可以看做是相对引用)解析为直接引用(实际的内存地址)。
初始化
该阶段执行类变量的赋值上面的例子public static int value = 11
该阶段后value的值为11,。同时执行静态语句块。
卸载
当该类不存在实例,且加载该类的类加载器对象被回收,则方法区中的这块内存可以被垃圾回收。
参考:《深入理解Java虚拟机》