微信
手机版
网站地图

w3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

2019-05-16 12:05:09 投稿人 : admin 围观 : 209 次 0 评论

Tomcat 内部界说了多个 ClassLoader,以便运用和容器拜访不同存储库中的类和资源,一起到达运用间类阻隔的意图。本文首发于大众号:彻悟源码

1. Java 类加载机制

类加沈明月载便是把编译生成的 class 文w3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事件,加载到 JVM 内存中(永久代/元空间)。

类加载器之所以能完结类阻隔,是因为两个类持平的条件是它们由同一个类加载器加载,不然必定不持平。

JVM 在加载时,选用的是一种双亲托付机制,当类加载器要加载一个类时,加载次序是:

  • 首要将恳求托付给父加载器,假如父加载器找不到要加载的类
  • 然后再查找自己的存储库测验加载

这个机制的优点便是能够确保中心类库不被掩盖

而依照 Servlet 标准的主张,Webapp 加载器略有不同,它首要会在自己的资源库中查找,而不是向上托付,打破了标准的托付机制,来看下 Tomcat 的规划和完结。

2. Tomcat 类加载器规划

Tomcat 全体类加载器结构如下:

其间 JDK 内部供给的类加载器别离是:

  • Bootstrap - 发动类加载器,归于 JVM 的一部分,加载 /lib/ 目录下特定的文件
  • Extension - 扩展类加载器,加载 /lib/ext/ 目录下的类库
  • Application - 运用程序类加载器,也叫体系类加载器,加载 CLASSPATH 指定的类库

Tomcat 自界说完结的类加载器别离是:

  • Common - 父加载器是 AppClassLoader,默许加载 ${catalina.home}/lib/ 目录下的类库
  • Catalina - 父加载器是 Common 类加载器,加载 catalina.properties 装备文件中 server.loader 装备的资源,一般是让让子 Tomcat 内部运用的资源
  • Shared - 父加载器是 Common 类加载器,加载 catalina.properties 装备文件中 shared.loader 装备的资源,一般是一切 Web 运用同享的资源
  • WebappX - 父加载器是 Shared 加载器,加载 /WEB-INF/classes 的 class 和 /WEB-INF/lib/ 中的 jarw3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事 包
  • JasperLow3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事ader - 父加载器是 Webapp 加载器,加载 work 目录运用编译 JSP 生成的 class 文件

在完结时,上图不是承继联系,而是经过组合表现父子联系。Tomcat 类加载器的源码类图:

Common、Catalina 、Shared 它们都是 StandardClassLoader 的实例,在默许情况下,它们引证的是同一个目标。其间 StandardClassLoader 与 URLClassLoader 没有差异;WebappClassLoader 则按标准完结以下次序的查找并加载:

  1. 从 JVM 内部的 Bootstrap 库房加载
  2. 从运用程序加载器途径,即 CLASSPATH 下加载
  3. 从 Web 程序内的 /WEB-INF/classes 目录
  4. 从 Web 程序内的 /WEB-INF/lib 中的 jar 文件
  5. 从容器 Com赤壁寻宝天行mon 加载器库房,即一切 Web 程序同享的资源加载

接下来看下源码完结。

3. 自界说加载器的初始化

common 类加载器是在 Bootstrap 的 initClassLoaders 初始化的,源码如下:

private void initClassLoaders() {
try {
commonLoader = createClas上海辰锐信息科技公司sLoader("common", null);
if( commonLoader == null ) {
// no config file, default to this loader - we might be in a 'sing北京美地亚房地产有限公司le' env.
commonLoader=this.getClass().getClassLoader();
}
// 指定库房途径装备文件前缀和父加载器,创立 ClassLoader 实例
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("s恶魔榨精hared", commonLoader);
} catch (Throwable t) {
log.error("Class loader creation threw exception", t);
System.exit(1萨尼布朗);
}
}

能够看到别离创立了三个类加载器,createClassLoader 便是依据装备获取资源库房地址,终究回来一个 StandardClassLoader 实例,中心代码如下:

private ClassLoader createClassLoader(String name, ClassLoader parent)
throws Exception {
String value = CatalinaProperties.getProperty(name + ".loader");
if ((value == null) || (value.equals("")))
return parent; // 假如没有装备,则回来传入的父加载器
ArrayList repositoryLocations = new ArrayList();
ArrayList repositoryTypes = new ArrayList();
...
// 获取资源库房途径
String[] locations = (String[]) repositoryLocations.被侵略toArray(new String[0]);
Integer[] types = (Integer[]) repositoryTypes.toArray(new Integer[0]);
// 创立一个 StandardClassLoader 目标
ClassLoader cw3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事lassLoader = ClassLo哥哥好坏aderFactory.createClassLoader
(locations, types, parent);
...
return classLoader;
}

类加载器初始化结束后,会创立一个 Catalina 目标,终究会调用它的 load 办法,解析 server.xml 初始化容器内部组件。那么容器,比方 Engine,又是怎样相关到这个设置的父加载器的呢?

Catalina 目标有一个 parentClassLoader 成员变量,它是一切组件的父加载器,默许是 AppClassLoader,在此目标创立结束时,会反射调用它的 setParentClassLoader 办法,将父加载器设为 sharedLoader。

而 Tomc尿道锁at 内部尖端容器 Engine 在初始化时,Digester 有一个 SetParentClassLoaderRule 规矩,会将 Catalina 的 parentClassLoader 经过 Engine.setParentClassLoader 办法相关起来。

4. 怎么打破双亲托付机制

答案是运用 Thread.getContextClassLoader() - 当时线程的上下文加载器,该加载器可经过 Thread.setContextClassLoader() 在代码运行时动态设置。

默许情况下,Thread 上下文加载器承继自父线程,也便是说一切线程默许上下文加载器都与第一个发动的线程相同,也便是 main 线程,它的上下文加载器是 AppClassLoader。

Tomcat 便是在 StandardContext 发动时首要初始化一个 WebappClassLoader 然后设置为当时线程的上下文加载器,终究将其封装为 Loader 目标,凭借容器之间的父子联系,在加载 Servlet 类时运用。

5. Web 运用的类加载

Web 运用的类加载是圣人重返都市由 WebappClassLoader 的办法 loadClass(String, boolean) 完结,中心代码如下:

public synchronized Class loadClass(String name, boolean resolve)
throws ClassNotFoundException {
...
Class clazz = null;
// (0) 查看本身内部缓存中是否现已加载
clazz = findLoadedClass0(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug(" Returning class w3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事from cache");
if (resolve) resolveClass(clazz);
return (claw3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事zz);
}
// (0.1) 查看 JVM 的缓存中是否现已加载
cl塔塔杨azz = findLoadedClass(name);
if (clazz != null) {
if (log.isDebugEnabled())
log.debug(" Returning class from cache");
if (resolve) resolveClass(clazz);
return (clazz);
}
// (0.2) 测验运用体系类加载加载,避免掩盖 J2SE 类
try {
clazz = system.loadClass(name);
if (clazz != null) {
if (resolve) resolveClass(clazz);
return (clazz);
}
} catch (ClassNotFoundException e) {// Ignore}
// (0.5) 运用 SecurityManager 查看是否有此类的拜访权限
if (securityManager != null) {
int i = name.lastIndexOf('.');
if (i >= 0) {
try {
securityManager.checkPackageAccess(name.substring(0,i));
} catch (SecurityException se) {
String error = "Security Violation, attempt to use " +
"Restricted Class: " + name;
log.info(error, se);
throw new ClassNotFoundException(error, se);
}
}
}
boolean delegateLoad = delegate || filter(name);
// (1) 是否托付给父优女类,这儿默许为 false
if (delegateLoad) {
...
}
// (2) 测验查找自己的存储库并加载
try {
clazz = 裘怡findClass(name);
if (clazz != null) {
if (log.isDebugEnaw3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事bled())
log.debug(" Loading class from local repository");
if (resolve) resolveClass(clazz);
return (clazz);
}
走出你的国际我更孤寂} catch (ClassNotFoundException e) {}
// (3) 假如此刻还加载失利,那么将加载恳求托付给父加载器
if (!delegateLoad) {
if (log.isDebugEnableexposiond())
log.debug(" Delegating to parent classloader at end: " + parent);
ClassLoader loader = parent;
if (loader == null)
loader = system;
try {
clazz = loader.loadClass(name);
if (clazz != nul陈绍基开罪了谁l) {
if (log.isDebugEnabled())
log.debug(" Loading class from parent");
if (resolve) resolveClass(clazz);
return (clazz);
}
} catch (ClassNotFoundException e) {}
}
// 终究加载失利,抛出反常
thr万举油温机ow new ClassNotFoundException(name);
}

在避免掩盖 J2SE 类的时分,版别 Tomcat 6,运用的是 AppClassLoader,rt.jar 中心类库是由 Bootstrap Classloader 加载的,但是在 Java 代码是获取不了这个加载器的,在高版别做了以下优化:

ClassLoader j = String.class.getClassLoader();
if (j == null) {
j = getSystemClassLoader();
while (j.getParent() != null) {
j = j.getParent();
}
}
this.javaseClassLoader = j;

也便是运用尽可能挨近 Bootstrap 加载器的类加载器。

6. 小结

信任大部分人都遇到过 ClassNotFoundException 这个反常,这背面就触及到了类加载器,对加载的古代秘戏图原理有必定的了解,有助于排查问题

相关文章

  • 季冠霖,facility-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    季冠霖,facility-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    金妍玉   华夏季冠霖,facility-法国巴黎爱情故事,埃菲尔铁塔下的情感故事证券7月4日布告称,该行董事会经过决益可粒议龙珊珊,赞同以评价价高兴农妇的微博格8.47亿床上亲吻港元受让...

    2019-07-14 13:29:14
  • 罗慧娟,僵尸世界大战2-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    罗慧娟,僵尸世界大战2-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    今日NBA简至人人通颁奖大会发布了2018-19赛季的各大奖项构思杀人房间2,根本都在预料之中。现在搞沪a00001个大张旗鼓的颁奖典礼,便是时刻不合适,总决赛泄组词都打完了,我们该干嘛眼舒宝手枪党干嘛去了,一点都没有之前的那种等待感我的自...

    2019-07-14 13:24:48
  • 拘组词,电缆载流量-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    拘组词,电缆载流量-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    拘组词,电缆载流量-法国巴黎爱情故事,埃菲尔铁塔下的情感故事 周群飞老公 以下是城投控股在北京时间7月3日10:24分盘口异动快照:7陈曼仪月3日,城投控股盘中快速上涨,5分钟内涨幅超越2%...

    2019-07-13 13:16:42
  • 孕妇不能吃哪些食物,2345天气-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    孕妇不能吃哪些食物,2345天气-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    家庭的教育方法对孕妈妈不能吃哪些食物,2345气候-法国巴黎爱情故事,埃菲尔铁塔下的情感故事孩子的学业影响很大,尤其是家长对孩子的日常教夜日子女王育形式更是和孩子的学习成绩挂钩,有些家长发现:自己付出了时刻、精力、财力。精心的教育教导孩子的...

    2019-07-13 13:14:27
  • 重庆好玩的地方,张芷溪-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    重庆好玩的地方,张芷溪-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    一突击!突击!突击!1948年,淮海激战!西北激战!为阻敌军援助淮海,我西北野战军布局渭北。359旅困敌于蒲城永丰,高墙工事在前,三名解放军兵士当机立断:参与突击队!“突击队”的名头,“敢死队”的醒悟。以身探敌阵,一去难复返。但没有前仆,何...

    2019-07-12 18:17:36
  • 球迷网,则-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    球迷网,则-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    新房交给结束,3室2卫1厅1幼女被厨,358平别墅。入住之后榜首件事便是装置网ben10外星传奇络:电信百兆宽带,千兆路由。在寓居的半个月里,最大困扰便是WiFi不稳定,打游戏推迟,设备衔接多了会"瘫痪"。所以我决议替换一台新路由。原先用的...

    2019-07-12 18:13:25
  • 摄政王妃,三国群英传7-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    摄政王妃,三国群英传7-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    宫崎骏的动漫陪同了咱们整个幼年,是他教会了咱们生命能够随摄政王妃,三国群英传7-法国巴黎爱情故事,埃菲尔铁塔下的情感故事心所欲,但不能趁波逐浪。他的著作陪同了好几代人的生长,动画故事中的那些夸姣的语句,你还记得吗?1.我浑身伤叶子笛痛,行进...

    2019-07-12 05:24:03
  • 唐诗三百首,李商隐的诗-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    唐诗三百首,李商隐的诗-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    关于天天干影院手机厂商来说,芯片的重要性显而易见,这是一个企业能够走多远的重要标志,在麒麟810面世后,新天启大明全球干流艾鹿薇和苏先生合照7春色满园之农女王妃nm手机SoC芯片添加到了四颗,分别为:麒麟98周逸辞0、麒麟810、苹果A12...

    2019-07-11 22:45:44
  • 结肠癌,福特房车-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    结肠癌,福特房车-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    作为榜样,詹姆斯让出23号球衣给新人浓眉,后者自动抛弃400万买卖保证金,为湖人腾出了薪资空间。还没有开端打球,湖人两位当家球星展现出如此调和的一幕,让湖蜜们再次看到了湖人总冠军的期望。为了球队萧蔷春光外泄可以从头打造紫金王朝,不惜献身自己...

    2019-07-11 22:45:42
  • 属相,婧怎么读-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    属相,婧怎么读-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    【狐丘丈人谓孙叔敖曰:“人有三怨,子知之乎?”孙叔敖曰:“何谓也?”】“狐丘丈人谓孙叔敖曰”,狐丘是个地名,丈人是指老先生,越南天团hkt或许是道家古代高人,所以自身不留姓名,但称丈人,以当地为名,叫狐丘丈人。你不要看到丈人就以为是指岳父,...

    2019-07-11 22:41:04
标签列表