杰表技术论坛 's Archiver

admin 发表于 2011-11-1 19:06

tomcat 中的 classloader

参考: [url=http://www.javabeat.net/articles/177-tomcat-60-servlet-container-overview-5.html][color=#0066cc]http://www.javabeat.net/articles/177-tomcat-60-servlet-container-overview-5.html[/color][/url]
一、Bootstrap class loader
1. classloader以树形方式组织。
2. classloader类发现机制,推荐是优先找父loader里的类,再找自己,也就是说,如果父里有String.class,本loader也有 String.class, 则以父的String为准。这种机制,可以保证不会有恶意代码,来覆盖系统类。
3. 根classloader称为 Bootstrap class loader,是用native代码实现。是JVM的一部分。
4. 根classloader加载如 java.lang.Object这样的类,java.lang.*, java.util.*也是从该loader加载。
5. jre/lib/rt.jar中定义 java.lang.*,java.util.*

二、Extension class loader
1. 是一个 URLClassLoader,加载JAVA_HOME/jre/lib/ext 目录下的所有jar里的类,这个目录,无须加入到classpath,就会被自动加载。

三、System class loader
1. 是一个URLClassLoader,自动加载 CLASSPATH里的所有类。
2. 如何找到 java.lang.String类, 到SystemClassLoader找,到ExtensionClassLoader里找,到 Bootstrap class loader里找,在rt.jar里找到。
3. 如何找到一个CLASSPATH里的类,Bootstrap 找不到-> Extension 找不到-> System classloader 找到,加载到jvm.
4. classloader 在查找之前,必须有缓存,如果缓存中有该类,则直接返回。
5. 类实例是以类名+classloader来区别的,所以,即使类名相同,但加载它们的classloader不同,则被认为是不同的class
   Class a = class.forName("com.Test",aclossloader);
   Class b = class.forName("com.Test",bclossloader);
   a 与 b 不同。
6. 上面的 classloader 不能看到下面的 classloader里的类,下面的类,能看到上面的类,如任何classpath里的类,能看到String类。
7. 如何知道一个类,由哪个classloader加载?简单,classa.getClassLoader();
8. 每个线程,都有一个线程上下文的classloader,
   a.如何得到这个?Thread. currentThread().getContextClassLoader(),
   b.什么时候设置的?线程创建时,创建那个线程的 classloader设置的,特别地,main()的线程上下文classloader 为 system class loader.
   c.用在什么地方?  ...

三、Tomcat还有 Common class loader
此loader 用于加载 catalina_home\lib下的类。

三.1 Server class loader
在catalina.properties里定义,好像是 server.loader属性,只供tomcat内部使用,对web app不可见.

三.2  Shared class loader
在catalina.properties 的 shared.loader里定义,对所有 web app 共享。

四. web app class loader.
加载web-inf\lib 和classes目录下的类。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.