热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tomcat实现分析(一)类加载及容器组件

启动脚本启动命令中的参数如下:org.apache.catalina.startup.Bootstrapstart-Djava.util.logging.config

启动脚本

启动命令中的参数如下:

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组件;

转:https://www.cnblogs.com/diecui1202/p/3530059.html



推荐阅读
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 如何正确配置与使用日志组件:Log4j、SLF4J及Logback的连接与整合方法
    在当前的软件开发实践中,无论是开源项目还是日常工作中,日志框架都是不可或缺的工具之一。本文详细探讨了如何正确配置与使用Log4j、SLF4J及Logback这三个流行的日志组件,并深入解析了它们之间的连接与整合方法,旨在帮助开发者高效地管理和优化日志记录流程。 ... [详细]
  • 在Java应用程序中调用`response.getStatus()`方法时遇到了`NoSuchMethodError`异常,经过分析,初步判断为依赖冲突问题。通过检查项目依赖树发现,当前项目版本与某些库的版本不兼容,导致该方法无法被正确识别。建议通过更新相关依赖版本或使用依赖管理工具(如Maven或Gradle)来解决此问题,确保所有依赖项版本一致且兼容。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • 深入解析HTTP网络请求API:从基础到进阶的全面指南
    本文全面解析了HTTP网络请求API,从基础到进阶,详细介绍了Android平台上的两种原生API——HttpUrlConnection和HttpClient。这两种API通过对底层Socket的封装,提供了高效、灵活的网络通信功能。文章不仅涵盖了基本的使用方法,还深入探讨了性能优化、错误处理和安全性等方面的高级主题,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
author-avatar
双子汐晨_312
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有