服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

Tomcat类加载机制


发布日期:2018年10月19日
 
Tomcat类加载机制

Tomcat Server在启动的时候将构造一个ClassLoader树以保证模块的类库是私有的

Tomcat Server的ClassLoader结构如下

代码

    Bootstrap

    |

    System

    |

    Common

    / \

    CatalinaShared

    /\

    WebAppWebApp

其中

Bootstrap 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*jar

System 载入$CLASSPATH/*class

Common 载入$CATALINA_HOME/common/它们对TOMCAT和所有的WEB APP都可见

Catalina 载入$CATALINA_HOME/server/它们仅对TOMCAT可见对所有的WEB APP都不可见

Shared 载入$CATALINA_HOME/shared/它们仅对所有WEB APP可见对TOMCAT不可见(也不必见)

WebApp 载入ContextBase?/WEBINF/它们仅对该WEB APP可见

每个运行中的线程都有一个成员contextClassLoader用来在运行时动态地载入其它类系统默认的 contextClassLoader是systemClassLoader所以一般而言java程序在执行时可以使用JVM自带的类$ JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类可以使用ThreadcurrentThread() setContextClassLoader();更改当前线程的contextClassLoader来改变其载入类的行为

ClassLoader被组织成树形一般的工作原理是

) 线程需要用到某个类于是contextClassLoader被请求来载入该类

) contextClassLoader请求它的父ClassLoader来完成该载入请求

) 如果父ClassLoader无法载入类则contextClassLoader试图自己来载入

注意WebApp?ClassLoader的工作原理和上述有少许不同

它先试图自己载入类(在ContextBase?/WEBINF/中载入类)如果无法载入再请求父ClassLoader完成

由此可得

对于WEB APP线程它的contextClassLoader是WebApp?ClassLoader

对于Tomcat Server线程它的contextClassLoader是CatalinaClassLoader

上一篇:Tomcat服务器下JSP页中文问题解决方法

下一篇:详解awstats和tomcat配置指南