目录
浅聊一下类加载相关知识,参考《深入理解Java虚拟机第三版》~
主要参考HoSpot虚拟机 JDK8版本
类加载过程
类从被加载进java虚拟机内存到从java虚拟机中卸载,经历了七个过程:
加载,验证,准备,解析,初始化,使用,卸载
其中验证,准备,解析通常合称为连接。
类加载的最后一个阶段是初始化阶段。
下面就讲讲各个阶段都做了什么~
加载
在这个阶段,类加载器会根据类的全限定名去获取二进制字节流,将二进制字节流加载进方法区,并在方法区中生成类的Class对象,作为类数据访问的入口。
验证
在这个阶段,会对字节流按照《Java虚拟机规范》的要求进行验证,以保证虚拟机的安全。
准备
在这个阶段,会将为类的变量开辟空间,并对类常量(被 static final修饰的变量)进行赋值,
如果是类变量(被 static 修饰的变量)则赋默认值(即使代码中给这个类变量赋了其他值)
解析
在这个阶段,会将符号引用转为直接引用
例如,如果一个类中引用了另一个类的静态字段,在解析阶段就会确定这个静态字段的实际内存地址,将符号引用转换为直接引用,以便在后续运行时能够直接访问该字段
初始化
在这个阶段会执行类的构造器方法<clinit> ,这个方法是由编译器生成的,主要包括对类常量的赋值操作和执行静态代码块。(这边可以和准备阶段进行对比一下)
Java的类加载器
包括三个主要的类加载器,Bootstrap类加载器(引导类加载器,根的类加载器,启动类加载器),Ext类加载器(扩展类加载器),App类加载器(应用程序类加载器)
Bootstrap类加载器是JVM中的类加载器,由c++编写,负责加载<JAVA_HOME>\jre\lib下的一些核心类库,以及由参数-Xbootclasspath指定路径下的类库
其余两个类加载器由Java编写,都继承自UrlClassLoader,UrlClassLoader继承自SecureClassLoader,SecureClassLoader继承自ClassLoader(总之两个都继承自ClassLoader)
Ext类加载器负责加载<JAVA_HOME>\jre\lib\ext下的全部类库以及系统参数java.ext.dirs指定的路径下的全部类
App类加载器负责加载用户类路径下的类
双亲委派模型
在加载一个类时,App类加载器(第三层)先判断这个类是否被加载过,如果没被加载过,则交给Ext类加载器进行加载,然后Ext类加载器(第二层)会将类交给Bootstrap类加载器进行加载。最后所有的类加载请求就会交由最顶层的Bootstrap进行加载,如果Bootstrap加载不了当前这个类,则又从上往下进行判断能否进行加载。(Bootstrap加载不了给Ext,Ext加载不了就给App加载)
今天就分享到这,大家早点休息~
开发入门中,欢迎指教~