《深入理解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>。为实例赋值。
 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值