面试官要不你今天来详细讲讲双亲委派机制?

候选者:嗯,好的。

候选者:上次提到了:class文件是通过「类加载器」装载至JVM中的

候选者:为了防止内存中存在多份同样的字节码,使用了双亲委派机制(它不会自己去尝试加载类,而是把请求委托给父加载器去完成,依次向上)

候选者:JDK 中的本地方法类一般由根加载器(Bootstrp loader)装载,JDK 中内部实现的扩展类一般由扩展加载器(ExtClassLoader )实现装载,而程序中的类文件则由系统加载器(AppClassLoader )实现装载。

候选者:这应该很好理解吧?

面试官:雀食(确实)!

面试官顺着话题,我想问问,打破双亲委派机制是什么意思?

候选者:很好理解啊,意思就是:只要我加载类的时候,不是从APPClassLoader->Ext ClassLoader->BootStrap ClassLoader 这个顺序找,那就算是打破了啊

候选者:因为加载class核心的方法在LoaderClass类的loadClass方法上(双亲委派机制的核心实现)

候选者:那只要我自定义个ClassLoader,重写loadClass方法(不依照往上开始寻找类加载器),那就算是打破双亲委派机制了。

面试官:这么简单?

候选者:嗯,就是这么简单

面试官那你知道有哪个场景破坏了双亲委派机制吗?

候选者:最明显的就Tomcat啊

面试官:详细说说?

候选者:在初学时部署项目,我们是把war包放到tomcat的webapp下,这意味着一个tomcat可以运行多个Web应用程序(:

候选者:是吧?

面试官:嗯…

候选者:那假设我现在有两个Web应用程序,它们都有一个类,叫做User,并且它们的类全限定名都一样,比如都是com.yyy.User。但是他们的具体实现是不一样的

候选者:那么Tomcat是如何保证它们是不会冲突的呢?

候选者:答案就是,Tomcat给每个 Web 应用创建一个类加载器实例(WebAppClassLoader),该加载器重写了loadClass方法,优先加载当前应用目录下的类,如果当前找不到了,才一层一层往上找(:

候选者:那这样就做到了Web应用层级的隔离

面试官嗯,那你还知道Tomcat还有别的类加载器吗?

候选者:嗯,知道的

候选者:并不是Web应用程序下的所有依赖都需要隔离的,比如Redis就可以Web应用程序之间共享(如果有需要的话),因为如果版本相同,没必要每个Web应用程序都独自加载一份啊。

候选者:做法也很简单,Tomcat就在WebAppClassLoader上加了个父类加载器(SharedClassLoader),如果WebAppClassLoader自身没有加载到某个类,那就委托SharedClassLoader去加载。

候选者:(无非就是把需要应用程序之间需要共享的类放到一个共享目录下嘛)

面试官:嗯…

候选者:为了隔绝Web应用程序与Tomcat本身的类,又有类加载器(CatalinaClassLoader)来装载Tomcat本身的依赖

候选者:如果Tomcat本身的依赖和Web应用还需要共享,那么还有类加载器(CommonClassLoader)来装载进而达到共享

候选者:各个类加载器的加载目录可以到tomcat的catalina.properties配置文件上查看

候选者:我稍微画下Tomcat的类加载结构图吧,不然有点抽象

面试官:嗯,还可以,我听懂了,有点意思。

面试官顺便,我想问下,JDBC你不是知道吗,听说它也是破坏了双亲委派模型的,你怎么理解的。

候选者:Eumm,这个有没有破坏,见仁见智吧。

候选者:JDBC定义了接口,具体实现类由各个厂商进行实现嘛(比如MySQL)

候选者:类加载有个规则:如果一个类由类加载器A加载,那么这个类的依赖类也是由「相同的类加载器」加载。

候选者:我们用JDBC的时候,是使用DriverManager进而获取Connection,DriverManager在java.sql包下,显然是由BootStrap类加载器进行装载

候选者:当我们使用DriverManager.getConnection()时,得到的一定是厂商实现的类。

候选者:但BootStrap ClassLoader会能加载到各个厂商实现的类吗?

候选者:显然不可以啊,这些实现类又没在java包中,怎么可能加载得到呢

面试官:嗯…

候选者:DriverManager的解决方案就是,在DriverManager初始化的时候,得到「线程上下文加载器」

候选者:去获取Connection的时候,是使用「线程上下文加载器」去加载Connection的,而这里的线程上下文加载器实际上还是App ClassLoader

候选者:所以在获取Connection的时候,还是先找Ext ClassLoader和BootStrap ClassLoader,只不过这俩加载器肯定是加载不到的,最终会由App ClassLoader进行加载

面试官:嗯…

候选者:那这种情况,有的人觉得破坏了双亲委派机制,因为本来明明应该是由BootStrap ClassLoader进行加载的,结果你来了一手「线程上下文加载器」,改掉了「类加载器」

候选者:有的人觉得没破坏双亲委派机制,只是改成由「线程上下文加载器」进行类加载,但还是遵守着:「依次往上找父类加载器进行加载,都找不到时才由自身加载」。认为”原则”上是没变的。

面试官:那我了解了

本文总结

  • 前置知识: JDK中默认类加载器有三个:AppClassLoader、Ext ClassLoader、BootStrap ClassLoader。AppClassLoader的父加载器为Ext ClassLoader、Ext ClassLoader的父加载器为BootStrap ClassLoader。这里的父子关系并不是通过继承实现的,而是组合。

  • 什么是双亲委派机制: 加载器在加载过程中,先把类交由父类加载器进行加载,父类加载器没找到才由自身加载。

  • 双亲委派机制目的: 为了防止内存中存在多份同样的字节码(安全)

  • 类加载规则: 如果一个类由类加载器A加载,那么这个类的依赖类也是由「相同的类加载器」加载。

  • 如何打破双亲委派机制: 自定义ClassLoader,重写loadClass方法(只要不依次往上交给父加载器进行加载,就算是打破双亲委派机制)

  • 打破双亲委派机制案例: Tomcat

    • 为了Web应用程序类之间隔离,为每个应用程序创建WebAppClassLoader类加载器
    • 为了Web应用程序类之间共享,把ShareClassLoader作为WebAppClassLoader的父类加载器,如果WebAppClassLoader加载器找不到,则尝试用ShareClassLoader进行加载
    • 为了Tomcat本身与Web应用程序类隔离,用CatalinaClassLoader类加载器进行隔离,CatalinaClassLoader加载Tomcat本身的类
    • 为了Tomcat与Web应用程序类共享,用CommonClassLoader作为CatalinaClassLoader和ShareClassLoader的父类加载器
    • ShareClassLoader、CatalinaClassLoader、CommonClassLoader的目录可以在Tomcat的catalina.properties进行配置
  • 线程上下文加载器: 由于类加载的规则,很可能导致父加载器加载时依赖子加载器的类,导致无法加载成功(BootStrap ClassLoader无法加载第三方库的类),所以存在「线程上下文加载器」来进行加载。

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

阿里面试官:双亲委派都不懂就来面Java?相关推荐

  1. 面试阿里!妹子终面,阿里面试官问:有没有男朋友? 结果...

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 作者:  前线小熙  | 责编: 可可   来源 :开发者技术前线  刚好要到端午节前 ...

  2. java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了

    java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了 2022-03-11 16:49·LBL-埃文斯 前言 阿里巴巴面试规则 1.第一轮面试: 第一轮面试通常是电话面试,面试官会提前打电话约定面 ...

  3. eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...

    文章首发:阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默 什么是服务注册? 首先我们来了解下,服务注册.服务发现和服务注册中心的之间的关系. 举个形象的例子,三者之间的关系就好像是供货 ...

  4. python开发测试岗_作为测试开发岗的面试官,我都是怎么选人的?

    最近一段时间面试了不少人,主要是一些测试开发岗,中高级的初级的也都有:也有一些偏业务测试岗的候选人.总结出了一些方法论,或者说更多的是个人作为面试官所遵守的一套面试准则. 1.什么是面试? 面试不仅仅 ...

  5. mysql查询前段时间_没想到!我在简历上写了“精通MySQL”,阿里面试官跟我死磕后就给我发了高薪offer...

    事情是这样的 前段时间面试了阿里,大家也都清楚,如果你在简历上面写着你精通XX技术,那面试官就会跟你死磕到底. 我就是在自己的简历上写了精通MySQL,然后就开启了和阿里面试官的死磕之路,结果就是拿到 ...

  6. 阿里发布内部(面试官)题库:2022年Java社招岗(正式版)面试题

    阿里巴巴2022年Java架构师岗面试题(正式版) 这不马上就是金三银四的面试跳槽季了嘛,马士兵老师也是通过一些小手段为大家拿到了一份阿里巴巴2022年Java架构师岗面试题(正式版)现在分享给大家, ...

  7. 阿里面试官:“你有高并发经验吗?”

    "高并发经验你有吗?" 阿里面试官一句话问倒了我. 实际上,不在BAT这样的大厂工作,是很难接触到千万级别的高并发的. 但也正是这种难得,让各个大厂都抢着要这样的人才! 下面这六道 ...

  8. 阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题

    阿里巴巴2022年Java架构师岗面试题(正式版) 这不马上就是金三银四的面试跳槽季了嘛,小编也是通过一些小手段为大家拿到了一份阿里巴巴2022年Java架构师岗面试题(正式版)现在分享给大家,这份资 ...

  9. 阿里面试,三面都过了,却被无理由挂了,快来一起吃瓜

    进入互联网大厂一般都是"过五关斩六将",难度堪比西天取经.但当你真正面对这些大厂的面试时,有时候又会被其中的神操作弄的很是蒙圈. 近日,某位Android程序员发帖称,自己去阿里面 ...

最新文章

  1. ICLR2020 | 谷歌最新研究:用“复合散度”量化模型合成泛化能力
  2. Tensorflow broadcast 广播机制
  3. 动态规划 - 装配线调度问题
  4. 14.vue路由脚手架
  5. Python3 基础学习笔记 C07【函数】
  6. 螺旋矩阵 java实现(待消化)
  7. 类的静态成员函数和静态成员变量的使用
  8. python数据结构之列表(list)——超详细
  9. bzoj3668 [Noi2014]起床困难综合症
  10. [Python] 关键字 assert
  11. 怎么清理服务器数据库日志文件,SQL SERVER 数据库日志清理图文教程
  12. 很全很强大的图形学相关的论文和源码
  13. php 支付宝实名认证
  14. 过采样算法之SMOTE
  15. 敏捷项目管理的前世今生及应用-Part 2(之3355)
  16. nginx代理ws协议
  17. 阿里云如何绑定域名(阿里云域名如何绑定ip)
  18. 2022-2028全球碳纤维山地自行车行业调研及趋势分析报告
  19. 继蚂蚁金服OceanBase之后,腾讯也祭出了大杀技
  20. openEuler ceph mgr dashboard 无法登陆 报错 401 Unauthorized You are not authorized to access that resource

热门文章

  1. 自监督学习(十九):对比学习方法综述
  2. 对oracle的心得体会,学习心得征文活动精选一:Oracle学习的心得体会
  3. jenkin创建任务定时发邮件(window环境,linux类似)
  4. 根据不同的时间,页面显示不同图片,同时显示不同的问候语
  5. [勇者闯LeetCode] 38. Count and Say
  6. Citrix小贴纸--PVS差异vDisk.
  7. 真正有效压缩虚拟磁盘文件VHDX
  8. 成功品牌IP打造第一步,取好名
  9. CCRC信息安全服务资质六大方向申请条件----安全集成,安全运维 风险评估 应急处理 软件安全 灾难备份与恢复
  10. postroute stage 在局部增加底层metal strap 修动态IR的ICC脚本