启动脚本

启动命令中的参数如下:

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. MySql 数据库导入到 SQL Service

    1.下载安装ODBC驱动程序 地址:http://dev.mysql.com/downloads/connector/odbc/ 注意:系统的版本问题( 我的是64位的win7系统,但是SQL Ser ...

  2. KeepAlived主备/主主模型高可用Nginx

    部署准备: 两台CentOS 7主机HA1和HA2 CentOS 7 基于rpm包安装Nginx: 由于Base源中没有Nginx,所以要安装EPEL源,命令如下: wget http://dl.fe ...

  3. 安装android

    http://www.oschina.net/question/1463998_220998 http://www.cnblogs.com/zoupeiyang/p/4034517.html

  4. http2协议翻译(转)

    超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/2通过引进报头字段压缩以及 ...

  5. code project 上的内存管理的示例代码

    /******************************************************************** created: 2014/03/17 18:53 file ...

  6. NGUI 使用EventDelegate.Add与UIInput.onSubmit、UIInput.onChange限定编辑框中的内容

    Unity中,使用NGUI,通常为某个控件(如按钮)绑定事件(单击.双击.拖拽.滚轮.选择等)都是用UIEventListener,比如: public void Bind() { UIEventLi ...

  7. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA

     环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...

  8. Python模块:hashlib

    hashlib:提供了常见的摘要算法,如MD5,SHA1等. import hashlib m = hashlib.md5() m.update('how to use md5 in python h ...

  9. 关于PHP学习的各种网站

    http://www.shouce.ren/ 各种开发手册 http://yii2.techbrood.com/guide-upgrade-from-v1.html yii2.0和之前版本的区别htt ...

  10. 用keras的cnn做人脸分类

    keras介绍 Keras是一个简约,高度模块化的神经网络库.采用Python / Theano开发. 使用Keras如果你需要一个深度学习库: 可以很容易和快速实现原型(通过总模块化,极简主义,和可 ...