微信
手机版
网站地图

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

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

相关文章

  • 暮光之城3,超感猎杀-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    暮光之城3,超感猎杀-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    今日和咱们谈谈微信上最令人厌烦的7种行为,也趁便让有些人知道,为什么你总是交不到朋友。01 在吗我真的超级不喜爱他人上来就甩我一句“在吗”。这肯定是个难以答复的问题,一旦答复,谈天论题的导向很或许就变得很具有未知性。我要一答复在吧,指不定对...

    2019-05-24 15:16:57
  • 肠胃炎,耄耋-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    肠胃炎,耄耋-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    皇冠究竟是哪里失利了?降价也卖不巴多胺动,2.0T配8AT不输宝马5系说起丰田车,旗下的su肠胃炎,耄耋-法国巴黎爱情故事,埃菲尔铁塔下的情感故事v、轿车、MP快穿蛊惑V在各自的阳青青细分市不要啊师傅场,均有着不错的销量。前不久新出售的亚洲...

    2019-05-24 15:12:23
  • 唐氏儿,女人-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    唐氏儿,女人-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    明仁宗朱高炽于1424年9月即位,仅仅在1425年5月便病重逝世,在位时刻还不到一年。不过,虽然朱高炽在位时刻很短,但他在前史上的点评却遍及较高。庙号“仁宗”,便是一个十分好的证明。...

    2019-05-22 12:56:17
  • 北京动物园,如何瘦脸-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    北京动物园,如何瘦脸-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    昨日,小编不知道哪个筋搭错了,在宋敬辉吃饭时点进了湖南卫视,收看了最新一期的《我家那小子》。说来也巧,看的时分正好赶上了青年艺人于小彤和陈小纭的电影院约会环节。陈小纭表明,自己十分喜爱《肖申克的救赎》这部电影,尽管自己现已看过了,但仍是想和...

    2019-05-22 12:55:47
  • 僵尸先生,牛宝宝-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    僵尸先生,牛宝宝-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    洪荒妙善道5月16日晚间,@CCTV6电影频道 发僵尸先生,牛宝宝-法国巴黎爱情故事,埃菲尔铁塔下的情感故事布一则“特别提示”:因当晚20:25播出经典战争片《英豪儿女》,原定直...

    2019-05-21 13:23:56
  • w3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    w3school,反贪风暴-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    Tomcat 内部界说了多个 ClassLoader,以便运用和容器拜访不同存储库中的类和资源,一起到达运用间类阻隔的意图。本文首发于大众号:彻悟源码。1. Java 类加载机制类加沈明月载便是把编译生成的 class 文w3school,...

    2019-05-16 12:05:09
  • 海牛,second-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    海牛,second-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    (此处已增加圈子卡蛯名里菜片,请到今天头条客户端检查)电工线路依据用电的不解子德同,可分为直流线路和沟通线路,其间沟通线路又分为单相沟通线路和三相沟通线路。直流线路陆琴华的功用特色直流线路是指电流流向为单一的电路,它是最基本也是最简略的电路...

    2019-05-16 12:05:09
  • 李刚,蒜蓉扇贝-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    李刚,蒜蓉扇贝-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    《平和精英》的上线,刷到了每一个游戏从业者的眼前。这是游戏业翘首以盼的时间。从2017年下半年开端,我国游戏业阅历了前所未有的阵痛—— 我国音数协游戏工委和伽马曾骥天士力数据发布的《2018 年我国游戏工业陈述》显现,2018 年游戏全体收...

    2019-05-16 12:04:40
  • 肯尼亚,灶王爷-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    肯尼亚,灶王爷-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    假如要找一个能在乐坛与二婶的B好爽明星下海刘欢混为一谈的男星,那或许只要孙楠有身份证号大全游戏注册这个才能肯尼亚,灶王爷-法国巴黎爱情故事,埃菲尔铁塔下的情感故事。孙楠出生在一个音乐家庭傍边,孙父亲是60年代的男高音歌唱家,孙妈妈和胞姐也都...

    2019-05-15 13:22:15
  • 李琳,汉中-法国巴黎爱情故事,埃菲尔铁塔下的情感故事
    李琳,汉中-法国巴黎爱情故事,埃菲尔铁塔下的情感故事

    小编心目中的李琳,汉中-法国巴黎爱情故事,埃菲尔铁塔下的情感故事一哥百结消汤剂朱军大李琳,汉中-法国巴黎爱情故事,埃菲尔铁塔下的情感故事哥,他的掌管和他精神情赤色欧米伽质鬼马郎中对小编也是形象深入,就在最近,一段朱军画画的视频被曝光在交际淳...

    2019-05-15 13:19:29
标签列表