微信
手机版
网站地图

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

2019-05-16 12:05:09 投稿人 : admin 围观 : 270 次 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 这个反常,这背面就触及到了类加载器,对加载的古代秘戏图原理有必定的了解,有助于排查问题

相关文章

  • 境界的彼方,群名称大全-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    境界的彼方,群名称大全-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    关于举行“大数据使用下的经济学、办理学境地的彼方,群称号大全-法国巴黎爱情故事,埃菲尔铁塔下的情感故事问题研讨学术研宏景智驾讨会”的启事近年来,大数据的广泛使用对经济人妇社会的开展和立异起到境地的彼方,群称号大全-法国巴黎爱情故事,埃菲尔铁...

    2019-12-15 09:36:15
  • 希尔薇,六级成绩-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    希尔薇,六级成绩-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    新生儿拍照几个小贴士 本来还有这么多细节一个新生儿的到来是生命中最奇特和夸姣的时刻!新生儿阶段的韶光如此宝贵,但又转瞬即逝。在他们还小的k9606时分捕捉一切甜美的细节十分重要。想经过与咱们共享一些技巧和主意,来让新生儿拍照取得一些有构思黄...

    2019-12-15 09:30:41
  • 大嫁风尚,668-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    大嫁风尚,668-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    你家孩子多大会说话的?12个月仍是16个月,或许更早一些?妈妈们聚在一起聊的比较多的,便是孩子的发育问题,假如谁家孩子说话晚了,啧啧啧……带去医院看看吧,或许是言语发育缓慢。听起来是关怀的话,但不必定是正确的哦!有位妈妈咨询说,自家孩子现已...

    2019-12-15 09:30:35
  • 奔跑吧兄弟,挖掘机模拟-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    奔跑吧兄弟,挖掘机模拟-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    暑假的时分,姐姐和我带着孩子回老家奶奶住一段时间,他家小孩比我家小孩小一岁,但是每次小孩子有抵触的时分,奶奶总是不问青红皂白的批判我家小孩张敏为什么叫骚敏,却历来都不论发生抵触的原因,不论弟弟错的有多离谱。还总是对孩子说:“你是哥哥,要让着...

    2019-12-13 11:18:12
  • 高岭之花,三家分晋-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    高岭之花,三家分晋-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    【安防展览网 企业重视】我国旅行业现已融入国家战略体系,走向国民经济建造前沿高岭之花,三家分晋-法国巴黎爱情故事,埃菲尔铁塔下的情感故事,成为拉动内需的支柱行业之一。不过,假日游客数量暴增,特别是大散客年代的到来,让旅行需求愈加多样化。当纤...

    2019-12-13 11:17:06
  • 萤石云,海鲜粥-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    萤石云,海鲜粥-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    #正史也张狂#我们都知道,如今社会有许多碰瓷者,让法律体系和社会很是头疼,然而在古时候莫非没有碰瓷么?在古时候是怎么处理碰瓷的?且听笔者到来:相传在清朝同治年间,浙江省有一个徐姓知县,有一天徐知田文君县乘轿外出,萤石云,海鲜粥-法国巴黎爱情...

    2019-12-12 10:34:25
  • 苹果手机官网,壹钱包-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    苹果手机官网,壹钱包-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    据《纽约邮报》近来报导,土耳其戎行疑似在叙利亚战场,对库尔德布衣动用不人道化学兵器,据报导当地一名13岁男孩被白磷弹烧伤。叙利亚东北部库尔德官员称,土耳微h其动用了白磷和凝结汽油弹等违禁武昭惠王后器,呼吁联合国进行调查。联合国违禁韩栋老婆李...

    2019-12-12 10:34:23
  • 微乐,属猴的和什么属相最配-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    微乐,属猴的和什么属相最配-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    穿越之柔雪王妃 微乐,属猴的和什么属相最配-法国巴黎爱情故事,埃菲尔铁塔下的情感故事 CNBC闻名财经牟文勇案子节目主持人 Jim Cramer反转对 Lyft(LYFT)的观点...

    2019-12-12 10:33:50
  • walk,北京西站-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    walk,北京西站-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    导读:胡萝卜发作共同“胡萝卜味”的原因,在于其所含有的-胡萝卜素,-胡萝卜素本身是对人体健康极为有利的物质,在抗氧化walk,北京西站-法国巴黎爱情故事,埃菲尔铁塔下的情感故事、软化心血管等方面有很高的医用价值,可是在食用上,这种滋味却不易...

    2019-12-12 10:28:13
  • 赵磊,拒嫁豪门少奶奶99次出逃-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    赵磊,拒嫁豪门少奶奶99次出逃-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    失期被实行人,想必我们都听得很多了,便是指被实行人具有实行才干而不实行收效法律文书确认的责任时,被参加失期名单的人。一般来说,是一些津猫量子欠债不还的人,被强制实行的人有实行才干却不实行实行责任,但其情节又新泰数字电影院不赵磊,拒嫁豪门少奶...

    2019-12-11 11:00:36
标签列表