java架构师培训-java类隔离加载原理

69 篇文章 0 订阅
43 篇文章 0 订阅

Java类隔离加载实现原理是什么?JVM为全局类加载器提供了一个设置接口,该接口直接替换了全局类加载器,但是无法同时解决多个自定义类加载器的问题。但是,JVM将选择当前类的类加载器以加载该类的所有引用的类。

java架构师培训

类隔离技术是什么?

只要编写了足够的Java代码,就肯定会发生这种情况:系统新引入了一个中间件jar包,编译后一切正常,并且在运行时立即报告错误:java.lang.NoSuchMethodError,然后哼哼,我开始寻找解决方案,最后,当我对数百个依赖程序包的视线几乎是盲目的时,我发现了冲突的jar。解决问题后,我开始抱怨中间件为什么有这么多不同版本的jar。我写了五分钟的代码。这些包装整天都在排队。

上面这种情况就是Java开发过程中常见的情况,原因也很简单,不同jar包依赖了某些通用jar包(如日志组件)的版本不一样,编译的时候没问题,到了运行时就会因为加载的类跟预期不符合导致报错。

举个例子:A和B分别依赖了C的v1和v2版本,v2版本的Log类比v1版本新增了error方法,现在工程里面同时引入了A、B两个jar包,以及C的v0.1、v0.2版本,打包的时候maven只能选择一个C的版本,假设选择了v1版本。到了运行的时候,默认情况下一个项目的所有类都是用同一个类加载器加载的,所以不管你依赖了多少个版本的C,最终只会有一个版本的C被加载到JVM中。当B要去访问Log.error,就会发现Log压根就没有error方法,然后就抛异常java.lang.NoSuchMethodError。这就是类冲突的一个典型案例。

java架构师培训

类冲突的问题如果版本是向下兼容的其实很好解决,把低版本的排除掉就完事了。但要是遇到版本不向下兼容的那就陷入了“救妈妈还是救女朋友”的两难处境了。

为了避免两难选择,有人就提出了类隔离技术来解决类冲突的问题。类隔离的原理也很简单,就是让每个模块使用独立的类加载器来加载,这样不同模块之间的依赖就不会互相影响。如下图所示,不同的模块用不同的类加载器加载。

为什么这可以解决班级冲突?这里使用Java机制:由不同的类加载器加载的类在JVM中看起来是两个不同的类,因为JVM中类的唯一标识符是类加载器的类名。这样,即使它们的类名相同,我们也可以同时加载两个不同版本的C类。请注意,这里的类加载器是指类加载器的实例,因此不必定义两个不同的类加载器。例如,图中的PluginClassLoaderA和PluginClassLoaderB可以是同一类加载器的不同实例。

   java架构师培训

实现类隔离的原理是什么?

类隔离就是让不同模块的jar包用不同的类加载器加载,要做到这一点,就需要让JVM能够使用自定义的类加载器加载我们写的类以及其关联的类。

那么如何实现呢?一个很简单的做法就是JVM提供一个全局类加载器的设置接口,这样我们直接替换全局类加载器就行了,但是这样无法解决多个自定义类加载器同时存在的问题。

实际上,JVM提供了一种非常简单有效的方法。我称其为类加载传导规则:JVM将选择当前类的类加载器来加载该类的所有引用类。例如,我们定义了两个类TestA和TestB,只要使用自定义类加载器来加载TestA,TestA就会引用TestB,然后在运行时,当TestA被调用到TestB时,JVM也会使用TestB。加载程序加载。

依此类推,只要与TestA相关联的所有jar包的类及其引用的类都将由自定义类加载器加载即可。这样,只要让模块的主方法类使用不同的类加载器进行加载,则将使用主方法类的类加载器来加载每个模块,以便可以使用不同的类加载多个模块。设备。这也是OSGi和SofaArk可以实现类隔离的核心原则。

了解类隔离的实现原理之后,从重写类加载器开始进行实操。要实现类加载器,首先让自定义的类加载器继承java.lang.ClassLoader,然后重写类加载的方法,这里有两个选择,一是重写findClass(Stringname),二是重写loadClass(Stringname)。

推荐阅读:java架构师培训:java最佳测试框架JBehave的基本介绍

如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1160405674,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java后端架构师-2023.xmind是一份关于Java后端架构师在2023年中可能面临的各种挑战和技能要求的思维导图。 首先,作为Java后端架构师,技术能力是最基本的要求之一。需要具备扎实的Java编程技能,熟悉Java的开发框架和工具,如Spring、Hibernate等。同时,掌握主流的数据库系统,如MySQL、Oracle等。对微服务架构和云计算平台有一定的了解和实践经验,如Docker、Kubernetes等。 其次,架构设计能力也是核心要求。需要具备良好的架构思维,能够根据业务需求设计合理的系统架构,并保证系统的可伸缩性、高性能、高可用性和安全性。对于分布式系统、消息队列、缓存、负载均衡等技术有深入的理解和应用能力。 此外,团队协作能力也是不可忽视的。作为架构师,需要与产品经理、项目经理、开发团队以及其他相关部门进行良好的沟通和协作,理解和把握业务需求,并能够将架构设计有效地传递给开发团队。善于团队管理和培养能力,能够引导团队成员解决技术难题。 最后,不断学习和适应新技术也是非常重要的。在技术领域,变化日新月异,作为架构师需要保持敏锐的技术判断力,能够及时了解和掌握新的技术趋势,并应用到实际项目中。 综上所述,Java后端架构师-2023.xmind介绍了未来Java后端架构师的技能要求和面临的挑战。通过不断学习和提升,拥有扎实的技术基础和良好的架构设计能力,具备团队合作和沟通能力,以及不断学习和适应新技术,才能在竞争激烈的市场中脱颖而出,成为优秀的Java后端架构师

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值