ChaosBlade 的演进史
EOS(2012-2015):故障练习平台的开始时期版本,故障注入工夫通过字节码巩固形式完毕,模拟数不胜数的 RPC 故障,化解微服务的强弱信任治理难题。
MonkeyKing(2016-2018):故障演习平台的晋升版本,丰硕了故障场景(如:财富、容器层场景),起始在生育意况开展局地规模化的彩排。
AHAS(2018.9-至今):Ali云应用高可用服务,内置练习平台的全套作用,援助可编写制定演练、练习插件扩充等力量,并结合了构造感知和限流降级的职能。
ChaosBlade:是 MonkeyKing 平台底层故障注入的兑现工具,通过对演习平台底层的故障注入手艺开展抽象,定义了朝气蓬勃套故障模型。合营客商本身的 CLI 工具实行开源,扶助云原生顾客张开混沌工程测量检验。
Classloader担当将Class加载到JVM中,而且规定由非常ClassLoader来加载(父优先的阶段加运载飞机制)。还大概有二个职务就是将Class字节码重新讲明为JVM统生龙活虎供给的格式
故障类加载模型
(3卡塔尔(英语:State of Qatar)初步化class对象,执行静态开端化器并在这里阶段末尾伊始化静态字段为私下认可值
作者:王鹏
Ali妹导读:裁减故障的最棒点子正是让故障平时性的产生。通过不停重复退步过程,持续升级系统的容错和弹性技能。昨日,阿里Baba(Alibaba卡塔尔(قطر把四年来在故障练习领域的创新意识和举行汇浓缩而成的工具进行开源,它正是“ChaosBlade”。就算您想要提高开垦效能,不要紧来询问一下。
(1卡塔尔(قطر加载字节码到内部存款和储蓄器:(这一步平时经过findclass(卡塔尔(英语:State of Qatar)方法完成)
以U奥迪Q3LClassLoader为例:该类的结构函数返现必得制定三个U讴歌MDXL数据技艺创建该对象,该类中包蕴叁个UHavalLClassPath对象,U锐界LClassPath会判别传过来的UPRADOL是文本也许Jar包,成立相应的FileLoader恐怕JarLoader大概暗中认可加载器,当jvm调用findclass时,那几个加载器将class文件的字节码加载到内部存款和储蓄器中
五、总结
高可用结构是涵养服务牢固性的中坚。
(2)NoClassDefFoundError:
平凡是接纳new关键字,属性援引了有个别类,世襲了有个别类或接口,但JVM加载这么些类时发掘这个类官样文章的这一个
功效和特色
此情此景充裕度高
ChaosBlade 支持的无知实验现象不唯有覆盖根基能源,如 CPU 满载、磁盘 IO 高、互联网延迟等,还包涵运营在 JVM 上的应用试验现象,如 Dubbo 调用超时和调用卓殊、钦点方法延迟或抛十分以至重临特定值等,同期提到容器相关的推行,如杀容器、杀 Pod。后续会持续的增添实施现象。
应用轻便,易于驾驭
ChaosBlade 通过 CLI 方式实施,具有本人的一声令下提示效果,能够简单神速的左边使用。命令的书写信守Alibaba公司内多年故障测量检验和排练实施抽象出的故障注入模型,档期的顺序明显,易于阅读和驾驭,减弱了混沌工程实施的妙法。
现象扩大方便
享有的 ChaosBlade 实验实行器相近信守上述提到的故障注入模型,使实验现象模型统风华正茂,便于开垦和保险。模型自个儿老妪能解,学习成本低,能够依据模型方便火速的扩张更多的无知实验现象。
3.怎样加载class文件:
分成多个步骤 加载字节码到内部存款和储蓄器、Linking、类字节开始化赋值
高可用系统卓绝实行
举例,依赖Ali云质量测验 PTS,高效用营造全链路压测连串,通过开源组件 Sentinel 落成限流和贬低作用。那二回,经验了 6 年时刻的改进和进行,累加在线上实行练习场景达数万次,大家将Alibaba在故障演习领域的新意和奉行,浓缩成二个混沌工程工具,并将其开源,命名称叫ChaosBlade。
(2卡塔尔(英语:State of Qatar)实现自定义ClassLoader日常会三番伍次USportageLClassLoader类,因为这几个类达成了绝大许多格局。
一手遮天上来讲,当图中兼有的政工都做完,大家就能够认为系统是贰个着实的高可用系统。但真是那样吧?
社区一起创建:
迎接访问 ChaosBlade@GitHub,参与社区一同创建,包括但不防止:
- 布局划杜撰计
- 模块设计
- 代码达成
- Bug Fix
- Demo样例
- 文书档案、网址和翻译
正文小编:中亭
翻阅原作
正文来源云栖社区同盟伙伴“ Ali技艺”,如需转发请联系原来的文章者。
6.自定义的classloader
怎么解决?
ChaosBlade 是什么?
ChaosBlade 是意气风发款据守混沌工程实施原理,提供丰富故障场景实现,扶植遍及式系统提高容错性和可恢复性的愚笨工程工具,可实现底层故障的流入,特点是操作轻便、无侵入、扩充性强。
ChaosBlade 基于 Apache License v2.0 开源合同,近来有 chaosblade 和 chaosblade-exe-jvm 八个货仓。
chaosblade 包含 CLI 和平运动用 Golang 实现的根基能源、容器相关的粗笨实验施行施行模块。chaosblade-exe-jvm 是对运维在 JVM 上的采纳实行混沌实验的推行器。
ChaosBlade 社区继续还恐怕会增添 C++、Node.js 等别的语言的无知实验实行器。
(3)UnsatisfiedLinkErrpr:
如native的办法找不到本机的lib
步骤三、钦点机器;
这段时间设计
成效迭代:
- 增加 JVM 练习场景,帮衬更加的多的 Java 主流框架,如 Redis,GRPC
- 加强 Kubernetes 演练场景
- 充实对 C++、Node.js 等接受的支撑
(2卡塔尔国Jvm加载class文件到内全体三种办法,隐式加载和出示加载,平日这两种艺术是叶影参差使用的
<1>隐式加载:是由此JVM来自动加载要求的类到内部存款和储蓄器的章程,当某些类被使用时,JVM开掘此类不在内部存储器中,那么它就能够自行加载该类到内部存款和储蓄器
<2>显示加载:通过调用this.getClasss.getClassLoader.loadClass(卡塔尔国,Class.forName,自个儿达成的ClassLoader的findClass方法
那是某工作部的系统拓扑图:
阿里Baba(Alibaba卡塔尔(英语:State of Qatar)在海量网络服务以至每年一次双11景色的实行进度中,沉淀出了席卷全链路压测、线上流量管控、故障练习等高可用大旨本事,并透过开源和云上劳动的款型对外出口,以赞助公司客户和开垦者享受Alibaba的本事红利,提升支付功用,降低工作的创设流程。
(2)StandardClassLoader:
加载tomcat容器的classLoader,别的webAppClassLoader在loadclass时,开掘类不在JVM的classPath下,在PackageTriggers(是一个字符串数组,满含生机勃勃组不能够采用webAppClassLoader加载的类的包名字符串卡塔尔下的话,将由该加载器加载(注意:StandardClassLoader并未覆盖loadclass方法,所以其加载的类和AppClassLoader加载没什么分别,何况选拔getClassLoader再次回到的也是AppClassLoader卡塔尔(英语:State of Qatar)(其它,假若web应用直接放在tomcat的webapp目录下该利用就能够经过StandardClassLoader加载,估摸是因为webapp目录在PackageTriggers中?卡塔尔(قطر
return;
ChaosBlade 能缓慢解决哪些难点?
衡量微服务的容错本领
透过模拟调用延迟、服务不可用、机器能源满载等,查看产生故障的节点或实例是不是被电动隔开分离、下线,流量调解是还是不是正确,预案是还是不是可行,同有时间观看系统完整的 QPS 或 RT 是或不是受影响。在这里功底上能够缓慢扩张故障节点范围,验证中游服务限流降级、熔断等是还是不是可行。最后故障节点增到诉求服务超时,揣测系统容错红线,衡量系统容错本事。
证实容器编排配置是或不是站得住
通过模拟杀服务 Pod、杀节点、增大 Pod 能源负载,观察系统服务可用性,验证别本配置、财富节制配置以致 Pod 下安顿的容器是或不是合理。
测验 PaaS 层是不是健康
透过模拟上层财富负载,验证调节种类的灵光;模拟信任的布满式存储不可用,验证系统的容错本领;模拟调整节点不可用,测验调节职务是还是不是自动员搬迁移到可用节点;模拟主备节点故障,测验主备切换是不是正常。
注脚监控告急的时间效果与利益性
因此对系统注入故障,验香港证肆证券交易监督委员会察和控制指标是不是准确,监察和控制维度是或不是完备,告急阈值是还是不是合理,告警是还是不是连忙,告急接收人是还是不是正确,文告门路是不是可用等,升高监督检查告警的精确和时效性。
定位与缓和难点的应急技艺
因而故障突袭,随机对系统注入故障,侦查相关人士对难题的应急力量,甚至难题陈述、管理流程是或不是创造,达到继续进行战争,锻练人稳固与缓和难题的手艺。
4.布满加载类错误解析
故障练习平台最主旨的便是Agent组件——字节码编织框架,这一个框架是纯Java的依照Instrumentation-API的AOP技术方案。它能够低价研究开发人士对于字节码插桩拆桩操作,能够十分轻巧的落到实处故障练习、流量录像以致其余的使用模块。
何以要开源?
多多铺面已经起来关怀并查究混沌工程,渐渐成为测量试验系统高可用,构建对系统消息不得缺点和失误的工具。但混沌工程领域方今还处于三个快速形成的级差,最棒实践和工具框架未有统大器晚成规范。实行混沌工程或许会带给一些神秘的事体风险,资历和工具的缺乏也将尤为阻止 DevOps 人士试行混沌工程。
混沌工程领域这两天也许有点不清了不起的开源工具,分别覆盖有个别世界,但那一个工具的利用格局差别,个中多少工具上手难度大,学习开销高,混沌实验工夫单风华正茂,使比相当多少人对混沌工程领域知难而退。
阿里Baba(Alibaba卡塔尔公司在混沌工程领域已经进行多年,将混沌实验工具 ChaosBlade 开源目标,大家目的在于:
- 让更多少人询问并走入到混沌工程领域;
- 浓缩塑造混沌工程的门径;
- 与此同期依赖社区的力量,完备越多的愚蠢实验现象,协同推进混沌工程领域的升高。
(2卡塔尔(قطرLinking:验证与剖判,富含3步:
<1>字节码验证
<2>类计划:希图代表每一个类中定义的字段、方法和落到实处接口所需的数据构造
<3>剖析:那么些阶段类装入器转入类所利用的其他类
故障演练平台:核实故障预案是或不是真正的起作用的平台。
(3卡塔尔上级委托机制:当三个加载器加载类字时,先委托其父加载器加载,若加载成功则反映给该加载器,若父加载器不能够加载,则由该加载器加载
- 弱信任挂掉,主流程挂掉,改进报废凭据的成本景况,下单主流程战败;
- 主导服务调用量陡增,某服务超时引起相关联的装有服务“雪崩”;
- 机房互联网或许某个机器挂掉,不可能提供基本服务。
(3)webAppClassLoader如:
Servlet等web应用中的类的加载(loadclass方法的家有家规详见P169)
// BEFORE
(1卡塔尔(قطرJVM平台提供三层的ClassLoader,那三层ClassLoader能够分成两类,分别是劳务JVM自个儿的,和劳务广大普通类的。分别是:
<1>BootstrapClassLoader:首要加载JVM本身工作所急需的类,该ClassLoader未有父类加载器和子类加载器
<2>ExtClassLoader:这么些类加载器雷同是JVM本人的黄金时代有的,但是或不是由JVM完结,首要用以加载System.getProperty(“java.ext.dirs”)目录地下的类,如本机的值“D:javajdk7jrelibext;C:WindowsSunJavalibext”
<3>AppClassLoader:加载System.getProperty("java.class.path"卡塔尔国(注意了在ide中运路程序时,该值经常是该品种的classes文件夹)中的类。全数的自定义类加载器不管直接落成ClassLoader,是三翻五次自UMuranoLClassLoader或其子类,其父加载器(注意:父加载器与父类的各自)都以AppClassLoader,因为不管调用哪个父类的布局器,最后都将调用getSystemClassLoader作为父加载器,而该方法再次回到的难为AppClassLoader。(当应用程序中并未别的自定义的classLoader,那么除了System.getProperty(“java.ext.dirs”)目录中的类,别的类都由AppClassLoader加载)
}
原书链接
上述内容只是私家笔记纪录,更加的多完整内容请购买小编原书籍查看。《深远分析JavaWeb本领内情》
- 系统强弱信赖混乱、弱信任无降级;
- 系统流量大幅度增加,系统容积不足,没有限流熔断机制;
- 硬件能源互联网现身难题影响系统运作,未有高可用的互联网构造。
1.Classloader类结构解析
王鹏,前年到场去何方机票工作部,首要从事后端研究开发职业,近年来在机票工作部担负路程单和故障练习平台以至公共服务ES、数据同步中间件等连锁的研究开发专门的学业。
2.ClassLoader的等第加运载飞机制
foo();
5.常用classLoader(书本此处其实是对tom加载servlet使用的classLoader解析)
Agent的总体布局如图所示:
7.完结类的热安顿:
(1卡塔尔(英语:State of Qatar)同多个classLoader的多少个实例加载同二个类,JVM也会识别为四个
(2卡塔尔(英语:State of Qatar)无法再一次加载同一个类(全名相同,并利用同四个类加载器),会报错
(3卡塔尔国不应有动态加载类,因为对象呗引用后,对象的属性构造被改换会吸引难题
留意:使用不一致classLoader加载的同三个类公事得到的类,JVM将用作是七个分歧类,使用单例方式,强制类型调换时都恐怕因为这几个缘故出难点。
那么故障练习平台就热火朝天进场了。当上述的高可用执行都做完,利用故障演练平台做二遍真正的故障演习,在系统运营期动态地流入一些故障,进而来证实下系统是还是不是比照故障预案去实践相应的降级或然熔断战术。
(1)AppClassLoader:
加载jvm的classpath中的类和tomcat的主题类
静态编织的标题是如若想改造字节码必须重启,那给开采和测量检验进度招致了相当的大的好多不便。动态的方式即使能够在运维期注入字节码完结动态拉长,但未曾统大器晚成的API超轻松操作不当。基于此,我们应用动态编织的点子、规范的API来标准字节码的改换——Agent组件。
(2卡塔尔加载自定义路径中的class文件
<1>加载特定来源的少数类:重写find方法,使特定类恐怕特定来源的字节码 通过defineClass获得class类并回到(应该切合jvm的类加载规范,其余类仍使用父加载器加载卡塔尔
<2>加载自顶多少个是的class文件(如通过网络传播的通过加密的class文件字节码卡塔尔(英语:State of Qatar):findclass中加密后再加载
二、系统高可用的方法论
(1卡塔尔主要由多个措施,分别是defineClass,findClass,loadClass,resolveClass
<1>defineClass(byte[] , int ,int卡塔尔国将byte字节流剖析为JVM能够分辨的Class对象(直接调用那么些法子生成的Class对象还不曾resolve,那个resolve将会在这里个指标真正实例化时resolve)
<2>findClass,通过类名去加载对应的Class对象。当大家兑现自定义的classLoader常常是重写那几个办法,依照传入的类名找到对应字节码的公文,并由此调用defineClass分析出Class独享
<3>loadClass运转时得以经过调用此办法加载二个类(由于类是动态加载进jvm,用有个别加载多少的?)
<4>resolveClass手动调用这一个使得被加到JVM的类被链接(分析resolve那一个类?)
(1卡塔尔国需求动用自定义classloader的图景
<1>不在System.getProperty("java.class.path"卡塔尔国中的类公事不得以被AppClassLoader找到(LoaderClass方法只会去classpath下加载特定类名的类),当class文件的字节码不在ClassPath就供给自定义classloader
<2>对加载的一些类须要作非常管理
<3>定义类的时效机制,对已经改进的类重新加载,完成热布置
去哪个地方网2007年营造到现在,随着系统规模的逐年扩充,已经有点不清个应用系统,这几个系统里面包车型地铁耦合度和链路的复杂度不断抓实,对于大家创设布满式高可用的系统构造具有十分大挑战。我们须求一个平台在运维期自动注入故障,查证故障预案是不是起效——故障演习平台。
(1)ClassNotFoundException:
平凡是jvm要加载二个文本的字节码到内存时,未有找到这么些字节码(如forName,loadClass等方法卡塔尔(英语:State of Qatar)
故障练习平台构造首要分为四局部:
- 静态编织:静态编织爆发在字节码生成时依照早晚框架的平整提前将AOP字节码插入到目的类和章程中;
- 动态编织:在JVM运营期对内定的法子成功AOP字节码加强。经常见到的法子大超级多使用重命名原有艺术,再新建叁个同名方法做代办的劳作情势来产生。
2、 Agent全部结构
*/
- BootstrapClassLoader带领类加载器加载的是JVM自己必要的类,那么些类加载使用C++语言完结的,是设想机本人的少年老成有的;
- ExtClassLoader它担负加载<JAVA_HOME>/lib/ext目录下大概由系统变量-Djava.ext.dir钦点位路线中的类库;
- AppClassLoader它肩负加载系统类路线java-classpath或-D java.class.path内定路径下的类库,也正是大家常常使用的classpath路线;
- CommonClassLoader甚至下面的都是汤姆cat定义的ClassLoader。
应用方法
类加载模型
原标题:去哪儿系统高可用之法:搭建故障演练平台
// THROWS
/*
四、如何利用
Agent和相关的lib会放到AppClassLoader那后生可畏层去加载,利用Javasist做字节码的织入,所以Javasist的加载器就是AppClassLoader。
- 零费用接入,没有必要申请别的能源;
- 故障注入肃清,不必要重启服务;
- 能够提供全数集群的拓扑布局。
在支付Agent的时候,第多个应用是故障演习平台,那么这时其实我们并没有供给Agent实践的进度中有自定义结果对象的回来,所以首先个本子的Agent接收硬编码的点子展开动态织入:
} catch (Throwable e) {
再正是超轻易拼接出错并且难以调节和测量检验,只可以把变化的类输出为文件,查看自身写的字节码编写翻译成class文件是不是准确,大概太优伤了!
Dubbo调用的注入进程
- 在BootstrapClassLoader里面注入Drill类作为通讯类;
- Agent会接受命令,依据事件类型对InvocationHandler做字节码变形,注入到对象APP;
- 在目的APP调用的时候,调用Drill.invoke(targetJavaClass,targetJavaMethod, targetThis, args)传递过来多少个参数(指标类、方法、实例、自个儿参数等);
- Drill类通过反射的格局调用AppClassLoader里面包车型大巴具体育赛事件完结,比方BEFORE事件的实践代码,来造成注入后的逻辑试行。
新的结构要求杀绝多个难点:
源于:Qunar技巧沙龙订阅号(ID:QunarTL)
有滋有味的标题,在这里种复杂的依据布局下被推广,一个依靠28个SOA服务的种类,各类服务99.99%可用。99.99%的二17遍方≈99.7%。0.3%意味意气风发亿次呼吁会有3,000,00次倒闭,换算成时间大概每月有2个钟头服务不牢固。随着服务正视数量的变多,服务动荡的可能率会呈指数性提升,那么些主题素材最后都会转变为故障表现出来。
步骤一、输入AppCode;
Agent的全体布局
- 前台呈现系统(WEB):来得系统里面包车型客车拓扑关系甚至各种AppCode对应的集群和措施,能够筛选具体的办法实行故障的流入和消弭;
- 公布种类(Deploy):本条系统关键用于将故障练习平台的Agent和Binder包青天布到目的APP的机器上同期运转试行。前台显示系统会传送给揭橥平台要开展故障注入的AppCode以至目的电脑软件的IP地址,通过那五个参数公布连串能够找到呼应的机器举办Jar包的下载和起步;
- 服务和下令分发系统(Server):这么些系统首要是用以命令的分发、注入故障的意况记录、故障注入和扫除操作的逻辑、权限校验以至有关的Agent的回到新闻选择效果。前台页面已经接入QSSO会对当前人能够操作的IP列表做故障注入,防备危害。后端命令分发的模块会和安顿在目的应用软件上的Agent举办通讯,将下令推送到Agent上进行字节码编织,Agent实践命令后归来的剧情通过Server和Agent的长连接传回Server端;
- Agent和Binder程序:Agent担负对目的应用软件做代办况兼做字节码巩固,具体代理的法子可以通过传输的一声令下来支配,代理方法后对艺术做动态的字节码巩固,这种字节码加强全数无侵入、实时生效、动态可插拔的特性。Binder程序首借使通过文告系统传递过来的AppCode和运行端口(ServerPort)找到对象APP的JVM过程,之后执行动态绑定,实现运行期代码巩固的效应。
do xxx
- 类隔开分离的主题材料:不要污染原生APP;
- 事件的贯彻是可编写翻译的;
- 支撑回到自定义的结果。
如图所示,事件模型首要可分为三类事件:
* do something...
dbaplus社会群众体育应接广大手艺职员投稿,投稿邮箱:editor@dbaplus.cn回去腾讯网,查看越来越多
1、故障练习平台的完整构造
责编:
这段时间AOP的兑现成二种艺术:
相遇的题材
第一介绍下几个类加载器:
作者介绍
try {
- 帮忙分化的模块的参预,比方Mock、流量录像、故障演习等;
- 帮助QSSO的权限验证;
- 支撑测量试验和虚伪情形的无资金接入;
- 扶植电动布署无需人工出席;
- 援救各样故障命令的发布和进行、 超时 、极度以至数据的回来;
- 帮衬办法等级的编制甚至代码执行流程的编写制定;
- 支撑在随性所欲的Web容器试行Agent代理。
上边的主意相同很周详的扑灭了难题,可是随着平台的利用专门的学问线要对不知凡几接口和方式同有的时候间实行故障练习,那么大家转移的Drill类里面就能够有各个:
系统之间的凭仗特别复杂、调用链路很深、服务中间从未分支。在此种复杂的倚重下,系统一发布出了几起故障:
故障类型:关键饱含运转期至极、超时等等。通过对系统有个别服务动态地流入运转期格外来完结模拟故障的目标,系统依据预案推行相应的国策验证系统是还是不是是真正的高可用。
Agent怎么着防卫“类污染”
Agent的风浪模型
四个故障原因:
应用的受益是很明显的:
三、故障演习平台
- 服务A调用服务B在Client端的Proxy层做AOP;
- 起步Agent而且生成二个Drill类invoke方法,抛出二个运维期极度;
- 字节码变形:在代码第大器晚成行从前增添Drill.invoke(卡塔尔(英语:State of Qatar);
- 只要想更改非凡类型,退换Drill类就能够,换到Sleep 3s ClassRedifine随后会再也load到JVM完结故障类型的转速大概清除。
// RETURN
一、背景
唯独想改良的是汤姆cat WebClassLoader所加载的com.xxx.InvocationHandler这一个类的Invoke方法,分裂的ClassLoader之间的类是不能够互相拜候的,做字节码的改造并不供给那几个类的实例,也无需回到结果,所以能够经过Instrument API获得这几个类加载器,何况能够依照类名称获取到那个类的字节码实行字节码调换。故障类Drill.class和变形后的com.xxx.InvocationHandler.class重新load到JVM中,完毕了插桩操作。
- 在方法体实践早先一向再次回到自定义结果对象,原有艺术代码将不会被施行;
- 在方法体重回以前再度布局新的结果对象,以至能够退换为抛出分外;
- 在方法体抛出特别之后再次抛出新的相当,以致足以改变为正规重回。
下大器晚成版本的Agent达成就发生了,把装有Agent的类和贯彻的机能抽象出来,放到二个自定义的AgentClassLoader里面,字节码注入到对象应用软件后得以经过反射的诀窍来调用具体的轩然大波落成。
手续二、选拔故障方法;
if method==业务线定义方法
常常来讲代码:
而是怎么才具正确利用啊?如下图所示:
步骤四、注入故障。
以Dubbo为例表明下哪些注入故障和消长逝障:
何以创设二个高可用的系统吧?首先要深入分析一下不可用的成分都有怎么着:
BEFORE在点子实行前事件、THROWS抛出非常事件、RETU奥迪Q3N重临事件。那三类事件可以在措施推行前、再次来到和抛出非凡那二种状态做字节码编织。
Agent组件:通过JDK所提供的Instrumentation-API达成了采纳HotSwap手艺在不重启JVM的情事下落成对轻便方法的拉长,无论大家是做故障演练、调用链追踪(QTrace)、流量录制平台(Ares)甚至动态扩展日志输出BTrace,都亟需一个怀有无侵入、实时生效、动态可插拔的字节码巩固组件。
事件模型能够做到多个效果与利益:
本文由神算子论坛六肖发布于科技展览,转载请注明出处:深入分析ClassLoader加载机制,六年打磨
关键词: