《深入理解Java虚拟机》读书笔记(JVM常识汇总四)

在运行Java程序时候,JVM必须将.class字节码文件加载到内存中,才可以实例化这个类。要加载类,就需要用到 类加载器,说道类加载器就要说到  “双亲委派模型”。  此图来源于 互联网。

第一层是:BootStrap Classloader是根类加载器,是最高级别的类加载器,它是由JVM启动时候创建的,负责加载Java中最核心的类(即 jre/lib/rj,jar),比如System,Object,String等。 这个类加载器是由C++ 写的。

第二层是:Extention ClassLoader 是扩展类加载器,在JDK 9以及之后,称之为 平台类加载器【Platform classloader】,它负责加载一些扩展的类(jre/lib/ext/*.jar),比如XML、加密和压缩相关的类。

第三层是:Application ClassLoader 是 应用类加载器,主要是用于加载用户定义的 classpath路径下的类,一般来说,这个就是默认的类加载器。

那么什么是 “双亲委派模型”呢?

如果一个类加载器收到了加载类的请求,它会把这个请求告诉在它上一层的类加载器,每一层的类加载器都要将这个请求向上传,最终传到 BootStrap 类加载器,BootStrap如果可以加载,它就自己加载这个类。如果BootStrap说,我自己无法加载这个类,因为它不在我的范围,它就告诉下一层的类加载器,让它尝试着加载,如果它也加载不了,那就继续丢给下一层的加载器,所以一般来说,应用类加载器就是默认的类加载器。

那么这个“双亲委派模型”有什么好处呢?

是为了Java程序的稳定性,试想,如果我们自己定义了一个Object类,那么在运行的时候。Java程序就会混乱,因为有了双亲委派模型的存在,所以最终 加载的始终是 rt.jar里的Object。

类加载过程 分为:加载、链接和初始化3个过程。

一、加载:读取 类文件,产生此类的二进制字节流、将静态数据结构转化为运行时数据结构、生成这个类的Class对象(即反射对象)

二、链接 :验证:是否以魔数  0xCAFEBABE开头、若不是,证明这个类无法加载或者类文件损坏。常量、静态变量是否合理,是否有父类,是否继承了不被允许继承的类等等。

链接 :准备:为类变量,即静态变量分配内存,并且设定默认值。

链接 :解析: 解析类和方法,确保类与类之间的相互引用的正确性,完成内存结构布局。

三、初始化

调用类构造器 ,<clinit>。为实例赋值。
 

猜你喜欢

转载自blog.csdn.net/Akanarika520/article/details/84927966