JVM学习笔记——类加载机制

先了解4种类加载器

  1. 启动类加载器 BootstrapClassLoader
    负责加载JRE的核心类库,如JRE的rt.jar,charsets.jar
  2. 扩展类加载器 ExtClassLoader
    负责加载JRE扩展目录ext中的jar包
  3. 系统类加载器 ApplicationClassLoader
    负责加载classpath路径下的类包(用户自己创建的类)
  4. 用户自定义类加载器 CustomClassLoader
    负责加载用户自定义路径下的类包

全盘委托类加载机制

当ClassLoader加载一个类时,除非显示调用另一个ClassLoader,否则该类所依赖或者引用的类都由这个ClassLoader进行加载。

双亲委派机制

自己创建的类用系统类加载器进行加载,当JVM进行加载时,首先会将要加载的类委托给扩展类加载器查看有没有加载过,扩展类加载器去找这个目标类,找不到则继续向上委托给启动类加载器进行查询,找不到就判断一下自己能不能进行加载,如果可以加载就会在自己这边进行加载,加载不了就把这个类交给子类,让子类进行加载。
一层一层向上递交,加载不了的则交给子加载器进行加载
在这里插入图片描述

双亲委派机制优势

  • 避免重复
    当父类的classLoader对一个类进行了加载,就不需要子类的classLoader加载
  • 安全
    当自定义类与核心类库中的具有相同的完全限定名时,例如自定义一个java.lang.String,这个类不会被加载,可以防止核心类库被随意篡改

为什么要打破双亲委派机制

以Tomcat容器为例,一个Tomcat容器等于跑一个JVM,但是在这同一个JVM中可部署多个应用(war包),当多个应用使用同一个jar资源时,则会产生冲突;Tomcat为了做出这种隔离,Tomcat使用自己独特的类加载机制,通过自定义的类加载器打破双亲委派机制。

两个应用在同一个JVM中,他们同时加载同一个jar包,而且这个jar包中的类权限定名相同,如果采用系统类加载器,内存中只用一个class,使用时冲突;而让每个应用都使用自己的自定义的类加载器,保证了虽然使用同一份文件,但在内存中有两个模板信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值