不能不了解的,Tomcat 类加载模型

1. Tomcat 类加载模型

在这里插入图片描述

图1-1、Tomcat 类加载模型图

1.1 服务器设计

1.1.1> 部署在同一个服务器上的两个 Web 应用程序所使用的 Java 类库相互隔离与共享
    允许同一个类库在服务器中存在不同版本,支持不同应用程序加载不同版本的类库;避免内存浪费,支持类库共享。
1.1.2> 服务器需要保证自身安全不受部署的 Web 应用程序影响
    服务器使用的类库与 Web 应用程序使用的类库相互隔离,以保证服务器安全。
1.1.3> 支持 JSP 应用程序的服务器,一般需要支持 HotSwap
    JSP 已不是市场主流技术,会在部分高校门户网站或者初学者实战项目见到。

1.2 Tomcat 类加载模型

    Tomcat 类加载模型如图1-1,遵循双亲委派机制,系统类加载器和服务器自定义类加载器。

  • JVM 管理的系统类加载器
    BootstrapClassLoader、ExtensionClassLoader、ApplicationClassLoader
  • Tomcat 管理的自定义类加载器
    CommonClassLoader、ServerClassLoader、SharedClassLoader、WebappClassLoader、JasperClassLoader

双亲委派机制
    一个类加载器收到类加载的请求,会把请求委派给父-类加载器去完成,如果父-类加载器没有找到所需的类无法完成加载时,子-类加载器开始尝试类加载。

1.3 类库结构与类加载器

1.3.1> 类库结构与类加载器关系表

类库结构类加载器类库配置可见性
commonCommonClassLoadercommon.loader 参数指定Tomcat Server全部 WebApp
serverCatalinaClassLoaderserver.loader 参数指定Tomcat Server
sharedSharedClassLoadershared.loader 参数指定全部 WebApp
webappWebappClassLoader/WebApp/WEB-INF 文件夹指定当前 WebApp

    Tomcat6.0 及更早版本会包含 common、server、shared 目录;通过目录结构匹配对应的类加载器 CommonClassLoader、ServerClassLoader、SharedClassLoader。
    Tomcat6.X 及之后的版本 common、server、shared 目录合并为 lib 目录,通过配置文件 \conf\catalina.properties 中的参数 common.loader、server.loader、shared.loader 指定这三个层级的类库。多个类库用逗号隔开;

1.3.2> CommonClassLoader、CatalinaClassLoader、SharedClassLoader

  • 三种类加载器分别可以加载对应类库的类;
  • CommonClassLoader 能加载的类,CatalinaClassLoader 和 SharedClassLoader 可以使用,而 CatalinaClassLoader 和 SharedClassLoader 自身加载的类与对方相互隔离,这点从 Tomcat 类加载模型图也可以看出。
  • WebappClassLoader 可以使用 SharedClassLoader 加载的类,但 WebappClassLoader 实例之间相互隔离。

1.3.3> WebappClassLoader、JasperLoader

  • 每一个 Web 应用程序对应一个 WebappClassLoader,每一个 JSP 文件对应一个 JasperClassLoader;
  • 各个 WebappClassLoader 相互隔离,所以 /webapps 下的多个 Web 应用程序的 /WebApp/WEB-INF 类库仅被当前 WebappClassLoader 类加载器加载。
    JasperClassLoader 加载范围仅仅是某个 JSP 文件编译出的 Class。当 Tomcat 检测到 JSP 文件被修改时,会替换掉当前 JasperClassLoader 实例,新建一个实例来实现 JSP 文件的 HotSwap。

1.3.4> Tomcat 6.X 及之后版本配置类库
catalina.properties 配置 common.loader、server.loader、shared.loader

package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat.

package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,\
org.apache.jasper.,org.apache.naming.,org.apache.tomcat.

# List of comma-separated paths defining the contents of the "common" classloader.
# If left as blank,the JVM system loader will be used as Catalina's "common" loader.
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"

# List of comma-separated paths defining the contents of the "server" classloader
# If left as blank, the "common" loader will be used as Catalina's "server" loader.
server.loader=

# List of comma-separated paths defining the contents of the "shared" classloader. 
# If left as blank, the "common" loader will be used as Catalina's "shared" loader.
shared.loader=

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar

tomcat.util.scan.StandardJarScanFilter.jarsToScan=log4j-taglib*.jar,log4j-web*.jar,log4javascript*.jar,slf4j-taglib*.jar

tomcat.util.buf.StringCache.byte.enabled=true

1.4 Tomcat 目录结构(扩展阅读)

在这里插入图片描述

图1-2、Tomcat 目录结构图
  • /bin 存放各种平台下启动和关闭 Tomcat 的脚本文件
  • /lib 存放 Tomcat 和 WebApp 能够访问的类库
  • /work 存放 Tomcat 把各种由 JSP 生成的 Servlet 文件放在这个目录下
  • /temp 存放 Tomcat 运行时的临时文件存放
  • /logs 存放 Tomcat 的日志文件
  • /conf 存放 Tomcat 的配置文件
  • /webapps 存放 WebApp,是 Web 应用程序的发布目录

不能不了解的,Java 内存模型
不能不了解的,Java 垃圾回收机制
不能不了解的,类加载机制
Powered By niaonao

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页