启动脚本

启动命令中的参数如下:

org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/opt/apache/apache-tomcat-7.0.47/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/opt/apache/apache-tomcat-7.0.47/endorsed -Dcatalina.base=/opt/apache/apache-tomcat-7.0.47 -Dcatalina.home=/opt/apache/apache-tomcat-7.0.47 -Djava.io.tmpdir=/opt/apache/apache-tomcat-7.0.47/temp

Tomcat Logging

启动参数里,其classpath中有/opt/apache/apache-tomcat-7.0.47/bin/tomcat-juli.jar,另外通过-D传递了两个属性:

-Djava.util.logging.config.file=/opt/apache/apache-tomcat-7.0.47/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

Tomcat默认采用的是JDK 1.4中引入的Java Util Logging(以下简称 JUL)日志组件,通过指定系统参数java.util.logging.config.file来设置日志输出级别、Handler等;

更多关于JUL的信息,可以参考Java™ Logging Overview

  1. 使用JDK的java.util.logging的局限

    一旦使用了JUL,那就意味着其是全局(整个JVM级别)共享,但是Tomcat作为一个Servlet容器(可以部署多个应用,每个应用的日志应该隔离),这种局限是不能接受的;同时,考虑到Tomcat内部本身日志可以动态替换实现,Tomcat开发了Java Util Logging Implementation(以下简称JULI);

  2. JULI的特性

    1. 覆盖JUL的LoggerManager(通过-Djava.util.logging.manager指定),支持ClassLoader粒度的日志输出;
    2. JULI默认采用DirectJDKLog来实现,本质就是JUL;
    3. 可以通过替换Tomcat的$CATALINA_BASE/bin下的tomcat-juli.jar,同时在$CATALINA_BASE/lib下新增log4j.jar、tomcat-juli-adapters.jar、log4j.properties,即可将其实现替换为log4j(具体步骤可参考Logging in Tomcat);

Tomcat类加载器

启动类为:org.apache.catalina.startup.Bootstrap,这个类职责比较简单:

  1. 完成Tomcat中classLoader的初始化;
  2. 通过Catalina类,引导Tomcat启动;

Tomcat的ClassLoader结构如下:

  1. AppClassLoader,即SystemClassLoader,通过-classpath指定;这里只包含Tomcat的启动类、依赖的ClassLoader实现类以及对JUL的增强(JULI);
  2. CommonLoader,通过$CATALINA_BASE/conf/catalina.properties中的common.loader指定,包括:$CATALINA_BASE/lib以及$CATALINA_HOME/lib下的classes、resources和jar包;

    CommonLoader为整个Tomcat和所有webapp所共享

  3. CatalinaLoader和SharedLoader,在官方的实现里,其仓库是空的,只是共享CommonLoader的仓库;
  4. WebAppClassLoader,每个webapp创建一个,webapp之间是隔离的,包括WEB-INF/classes以及WEB-INF/lib下的所有class和jar包;

    WebAppClassLoader加载类的方式与普通的双亲委派不一样,它是先从本地仓库加载,加载不到,再委派给parent ClassLoader(特殊类除外,比如JRE的类总是委派给parent,Servlet API相关的类则会被忽略,交由CommonLoader加载);

一个WebApp的类加载顺序如下:

  • Bootstrap classes of your JVM
  • System class loader classes(AppClassLoader)
  • /WEB-INF/classes of your web application
  • /WEB-INF/lib/*.jar of your web application
  • Common class loader classes(CommonLoader)

启动Tomcat

Tomcat主配置文件位于conf/server.xml,Bootstrap通过引导Catalina来解析server.xml,从而启动tomcat;

解析server.xml是通过Degister来完成的;

下面这张图描述了Tomcat内部组件及其关系:

其中:

  1. Tomcat的启动是各组件从外到内调用,从内到外完成;
  2. Server组件监听本地的8005端口,实现异步关闭Tomcat容器;
  3. 除了Catalina作为引导容器,其余窗口均实现LifeCycle,都可以包含多个LifeCycleListener;
  4. Engine及其子容器,均实现了Container,可以包含Pipeline, Logger, Loader, Realm, Manager等组件;
  5. 所有的Servlet均被包装成Wrapper组件;

Tomcat实现分析(一)--类加载及容器组件的更多相关文章

  1. 【Tomcat源码学习】-2.容器管理

    Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分.   一.Tomcat整体结构: Ser ...

  2. tomcat架构分析(connector BIO 实现)

    出处:http://gearever.iteye.com 在tomcat架构分析(概览)中已经介绍过,connector组件是service容器中的一部分.它主要是接收,解析http请求,然后调用本s ...

  3. [转]Tomcat启动分析

    [转]Tomcat启动分析 原帖 http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html 以下摘录了部分 --------------- ...

  4. java:Servlet(Create,LifeCycle,ServletWeb.xml文件的配置,交互式,Tomcat文件分析,单例安全模式)

    1.Servlet: Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容.这个过程为: 客户端发送请求至服务器端: 服务器将请求信息发送至 Servlet: Servlet ...

  5. Tomcat与spring的类加载器案例

    Tomcat与spring的类加载器案例接下来将介绍<深入理解java虚拟机>一书中的案例,并解答它所提出的问题.(部分类容来自于书中原文) Tomcat中的类加载器在Tomcat目录结构 ...

  6. 启动Tomcat一闪而过——分析及解决过程

    启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...

  7. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  8. tomcat原理分析与简单实现

    tomcat原理分析与简单实现 https://blog.csdn.net/u014795347/article/details/52328221 2016年08月26日 14:48:18 卫卫羊习习 ...

  9. tomcat架构分析 (connector NIO 实现)

    出处:http://gearever.iteye.com 上一篇简单记录了缺省配置的connector的内部构造及消息流,同时此connector也是基于BIO的实现.除了BIO外,也可以通过配置快速 ...

随机推荐

  1. vs快捷方式

    项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...

  2. 使用PS过程

    1. 设置图层背景色和前景色 设置背景色和前景色方法类似,下面以设置背景色为例说明.方法一:使用色板设置图片背景色第一步:单击"文件"菜单,选择"新建文档",这 ...

  3. ios 正则表达式之验证手机号、邮箱、身份证、银行卡

    1.手机号 + (BOOL) IsPhoneNumber:(NSString *)number { NSString *phoneRegex1=@"1[34578]([0-9]){9}&qu ...

  4. ASP.NET5 Beta8可用性

    ASP.NET5 beta8现已上都的NuGet作为一个工具升级到Visual Studio2015!此版本极大地扩展.NET核心对OS X和Linux所支持的范围.您现在可以使用网络,加密和全球化特 ...

  5. SQLSERVER进程CPU使用率100%

    解决SQLSERVER2008 CPU使用率99%: 1.dbcc checkdb 重建索引 2.檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , ...

  6. CODE[VS] 1230 元素查找

    1.题目戳这里 2.代码: #include<iostream> #include<algorithm> using namespace std; int n,m,a[1000 ...

  7. 【经验记录】Jconsole Jvisualvm 监控Tomcat

    环境:centos 6 1.首先检查hostname是否正确,输入以下命令 hostname -i 如果输出机器ip,则表示正确,如果输出 hostname: Unknown host 查看/etc/ ...

  8. cod-hw

    COD hw 4 Xinglu Wang 3140102282 2016-12-27 21:28:01 COD hw 45.35.3.15.3.35.3.45.3.55.3.65.45.4.15.4. ...

  9. 异步请求Ajax

    AJAX:Asynchronous JS And XML,包括HTML.CSS.JS.DOM.XML.JSON等,客户端技术范畴.主要目标:发起异步请求/响应,实现页面内容的局部刷新,提高浏览体验:实 ...

  10. Kubernetes1.5正式发布

    Kubernetes1.5正式发布 修复了很多已知问题 进一步增强federation相关特性 将PetSet改名为StatefulSet 将ScheduledJobs改名为CronJobs 新增了命 ...