常见面试题(九)tomcat

本文深入剖析Tomcat服务器的模块组成结构,包括Connector、Container、Service和Server的作用及交互,详细解读类加载器流程与线程模型。此外,提供全面的Tomcat调优策略,涵盖启动参数、容器内参数调整,提升吞吐量、响应时间和资源利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简单讲讲tomcat结构,以及其类加载器流程,线程模型等

模块组成结构:Tomcat的核心组件就Connector和Container,一个Connector+一个Container(Engine)构成一个Service,Service就是对外提供服务的组件,有了Service组件Tomcat就能对外提供服务了,但是光有服务还不行,还需要有环境让你提供服务才行,所以最外层的Server就是为Service提供了生存的土壤。

        ▁▂▃ Connector是一个连接器,主要负责接受请求并把请求交给Container,Container就是一个容器,主要装的是具有处理请求的组件。Service主要是为了关联Container与Connect,只有两个结合起来才能够处理一个请求。Server负责管理Service集合,从图中我们可以看到Tomcat可以提供多种服务,那么这些Service就是由Server来管理的。具体工作包括:对外提供一个接口访问Service,对内维护Service集合,维护Service集合包括管理Service声明周期等等。

   ☞ 文档结构组成:

 

<!-- Server代表整个容器,是Tomcat的顶层元素。服务器默认在8005端口,shutdown命令=关闭Tomcat -->

<Server>

<Listener />

<GlobaNamingResources>

</GlobaNamingResources>

<!-- Service包含多个Connector元素,而这些Connector元素共享一个Engine元素。 -->

<Service>

<!-- Connector元素代表与客户时间交互的组件,它负责接收客户的请求,已经向客户响应结果,

配置http为https主要是修改Connector -->

<Connector />

<!-- 每个Service只能有一个Engine元素,处理同一个Service中所有Connector元素接收到的客户请求.

Engine用来处理Connetcor收到的Http请求它匹配请求和自己的虚拟主机,并把请求转给对应的Host来处理 -->

<Engine>

<Logger />

<Realm />

<!-- 一个Engine包含多个host元素,每个host元素定义了一个虚拟主机,它包含一个或多个Web应用 -->

<host>

<Logger />

<!-- 由Context接口定义.是使用最频繁的元素,对应于一个Web App -->

<Context />

</host>

</Engine>

</Service>

</Server>

 ☞  类加载器流程:Tomcat启动时,会创建以下4种类加载器:

      1)、Bootstrap 引导类加载器:加载JVM启动所需的类,以及标准扩展类(位于jar/lib/ext上)

      2)、System 系统类加载器:加载Tomcat启动时的类,比如bootstrap.jar通常在catalina.bat或者catalina.sh中指定。指定位置位于CATALINA_HOME/bin下。

       

      3)、Common 通用类加载器:加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar

       

     4)、webapp应用类加载器:每个应用在创建后,都会创建一个唯一的类加载器。该类加载器会加载位于WEB-INF/lib下的jar文件中的class和WEB-INF/classes下的class文件。

     

     红色虚线表示:应用需要到某个类时,则会按照下面的顺序进行类加载。

     ①、使用bootstrap引导类加载器加载

     ②、使用system系统类加载器加载

     ③、使用应用类加载器在WEB-INF/classes中加载

     ④、使用应用类加载器在WEB-INF/lib中加载

     ⑤、使用common类加载器在CATALINA_HOME/lib中加载

 

 ☞  线程模型:支持以下四种线程模型。

 

2、tomcat如何调优,涉及哪些参数 ?

 ☞ Tomcat调优主要从四个方面考虑:1)、吞吐量。2)、Responsetime。 3)、Cpuload。 4)、MemoryUsage。

 ☞ 参数调优:1)、Tomcat启动参数的优化:Tomcat 的启动参数位于tomcat的安装目录\bin目录下,如果你是Linux操作系统就是catalina.sh文件,如果你是Windows操作系统那么你需要改动的就是catalina.bat文件。

   ✔ Linux系统中catalina.sh文件中添加如下参数(重要参数随后说明):

 

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking

-XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled

-XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods

-XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

  ◀ -Server(重要):只要Tomcat是运行在生产环境中,这个参数必须添加。因为Tomcat默认是java-client模式运行,添加server后表示以真实的production的模式运行,将拥有更大、更高的并发处理能力,更快、更强的JVM垃圾回收机制,可以获得更多的负载和吞吐量等等。

  ◀ -Xms -Xmx:既JVM内存设置了,把Xms与Xmx两个值设成一样是最优的做法。(否则当内存=Xmx向Xms变化时,CPU高速运转触发垃圾回收机制,严重时会导致系统‘卡壳’,因此一开始我们就把这两个设成一样,使得Tomcat在启动时就为最大化参数充分利用系统的效率。)

   ※在设这个最大内存即Xmx值时请先打开一个命令行:能够正常显示JDK的版本信息,说明这个值能够用。

  

  ◀ -Xmn:设置年轻代大小为512m。整个堆大小=年轻代 + 老年代 + 持久代。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

  ◀ -Xss:是指设定每个线程的堆栈大小。这个就要依据程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。

2)、Tomcat容器内优化:打开tomcat安装目录\conf\server.xml文件。   其中如下参数的默认值远远不够我们使用,我们对其进行了更改,更改后的配置如下:

 

<Connector port="8080" protocol="HTTP/1.1"          

URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"         

enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" 

acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

useURIValidationHack="false"    

compression="on" compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 

redirectPort="8443" />

  ▶ URIEncoding=”UTF-8”:使得tomcat可以解析含有中文名的文件的url。

  ▶ minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数。

  ▶ maxSpareThreads:如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

  ▶ connectionTimeout:网络连接超时时间毫秒数。

  ▶ maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。

  ▶ acceptCount:当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection。

  ▶ maxProcessors与minProcessors:在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。 通常Windows是1000个左右,Linux是2000个左右。

  ▶ useURIValidationHack:设成"false",可以减少它对一些url的不必要的检查从而减省开销。

  ▶ enableLookups:设置为"false",主要为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值

  ▶ disableUploadTimeout:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false

  ▶ 给Tomcat配置gzip压缩(HTTP压缩)功能:HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML、CSS、Javascript、Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP、JSP、ASP、 Servlet、SHTML等输出的网页也能进行压缩,压缩效率惊人。

    1)、compression="on" 打开压缩功能

    2)、compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB

    3)、noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩

    4)、compressableMimeType="text/html,text/xml" 压缩类型

  ▶ redirectPort: 如果我们走https协议的话,我们将会用到8443端口这个段的配置。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值