1. server.xml解读
1. Server
server标签为tomcat的根标签,它的一级子标签有:Listener
,GlobalNamingResources
,Service
。
它有2个属性:
port
:关闭服务器的监听端口
shutdown
: 关闭服务器的指令字符串
1.1 Listener
可以配置一些监听器,className
属性指定class文件位置。
1.2 GlobalNamingResources
可以配置一些全局的资源
1.3 Service
service标签,有一个name
属性,指定service的名称。它的下面一级标签有Listener
, Executor
, Connector
, Engine
。
1.3.1 Listener
配置生命周期监听器
1.3.2 Executor
这个标签是设置一个线程池,可以在Connector标签中使用。
name
:给这个线程池设置一个名称。
namePrefix
: 给这个线程池起一个名字,这个名字的前缀设置。
maxThreads
: 最大的线程数量。
minSpareThreads
: 核心线程的数量, 不会被销毁, 一直会存在。
maxIdleTime
: 线程空闲的时间, 设置空闲线程在这个时间之后被销毁,默认1分钟,这个值的单位毫秒
maxQueueSize
:最大的线程排队数量,默认值为int的最大值
prestartminSpareThreads
:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动
threadPriority
:线程池中线程优先级,默认值为5,值从1到10
className
:线程池实现类,未指定情况下,默认实现类为
org.apache.catalina.core.StandardThreadExecutor。如果想使⽤⾃定义线程池⾸先需要实现org.apache.catalina.Executor接口
1.3.3 Connector
配置创建连接器实例
port
: 监听端口号
protocol
: 指定协议,默认用HTTP/1.1,还可以选AJP/1.3。
connectionTimeOut
: 获取得连接后的等待超时时间,默认为-1不超时
redirectPort
: https使用的端口
URIEncoding
: 指定编码字符, tomcat8.x开始默认为UTF-8
executor
: 指定使用哪个线程池
1.3.4 Engine
servlet的模板引擎。它的下面一级子标签有Host
, Realm
。
它有2个属性
name
: 设置一个名称
defaultHost
: 设置默认的host
1.3.4.1 Host
设置一个虚拟主机, 它的一级标签有context
, value
。
它有4个属性。
name
: 设置站点的域名
appBase
: 设置站点的目录
unpackWARs
: 设置为true,解压war包
autoDeploy
:设置为true表示自动部署
1.3.4.1.1 Context
docBase
:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于 Host appBase的相对路径。
path
:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/web_demo。
1.3.4.1.2 Value
设置日志信息
className
: 日志类
directory
: 设置目录路径
prefix
: 设置日志文件名前缀
suffix
: 设置日志文件名后缀
pattern
: 设置日志的格式
2. Tomcat认识
我们往往有一个认识,Tomcat就是一个Catalina的实例,因为Catalina是Tomcat的核心。
tomcat启动时,会启动一个Catalina实例加载server.xml来创建一个server实例,一个server实例可以有多个service实例。每一个Service实例下可以有多个Connector实例和一个Container实例。一个Container实例有一个Engine实例,一个Engine实例拥有多个Host实例,而一个Host实例可以拥有多个Context实例。一个Context实例拥有多个Wrapper实例。
2.1 Catalina
负责解析Tomcat的配置文件(server.xml) , 以此来创建服务器Server组件并进文管理。
2.2 Server
服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式
2.3 Service
服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container。
2.4 Container
容器,负责处理用户的servlet请求,并返回对象给web用户的模块
2.5 Engine
表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host
2.6 Host
代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,一个虚拟主机下可包含多个Context
2.7 Context
表示一个Web应用程序, 一个Web应用可包含多个Wrapper
2.8 Wrapper
表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器
3. 类加载机制
3.1 JVM类加载机制
JVM 的类加载机制中有一个非常重要的⻆色叫做类加载器(ClassLoader),类加载器有自己的体系,Jvm内置了几种类加载器,包括:引导类加载器、扩展类加载器、系统类加载器,他们之间形成父子关系,通过 Parent 属性来定义这种关系,最终可以形成树形结构。
引导类加载器
<-扩展类加载器
<-系统类加载器
3.2 双亲委派机制
当某个class文件被类加载器加载时, 子类加载器会一级一级传递给父类加载器,如果最顶层的父类加载器加载不到,再传递给下一级子类加载,直到某个加载器加载完毕之后才停止, 这种机制被陈伟双亲委派机制。
这个机制的好吃就是:
- 避免重复加载,通过委托向上问一下, 加载过了, 就不用在加载了
- 保证核心的class文件不会被加载, 比如String.Class文件,如果在你的应用中也定义了这么一个类,如果被子类加载了的话,那么父类就不会加载核心库里面的String.class了, 这样就造成了核心的class被修改了。
3.3 Tomcat的加载机制
tomact没有严格遵守双亲委派机制,它会先用Webapp ClassLoader(每个应用都有一个loader
)加载webapp 的/WEB-INF/classes 和 /WEB-INF/lib 下的类。然后后面的加载才遵守双亲委派机制。
为什么不严格遵守双亲加载机制。比如有这么一个场景,一个tomcat下部署了2个应用,而两个应用下,分别引入了test-1.0.jar,test-2.0.jar包, 如果严格遵守双亲委派机制,那么就会导致tomcat只会加载其中一个jar包,而不会加载另外一个, 因为2个jar包里面的文件是一样的只是版本不同而已,所以说需要打破这种机制,让每个应用都加载对应的jar包。
4. Tomcat对https的支持
配置一个Connector 监听端口为8443
<!--
protocol 使用http协议并且使用NIO的模式
certificateKeystoreFile 配置证书文件位置
certificateKeystorePassword 配置证书密码
type 配置证书加密类型
-->
<Connector
port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" schema="https" secure="true" SSLEnabled="true">
<SSLHostConfig>
<Certificate
certificateKeystoreFile="" certificateKeystorePassword="" type="RSA"
/>
</SSLHostConfig>
</Connector>
5. Tomcat 性能优化策略
5.1 虚拟机运行优化(参数调整)
参数 | 参数作用 | 优化建议 |
---|---|---|
-server | 启动Server,以服务端模式运行 | 服务端模式建议开启 |
-Xms | 最小堆内存 | 建议与-Xmx设置相同 |
-Xmx | 最大堆内存 | 建议设置为可用内存的80% |
-XX:MetaspaceSize | 元空间初始值 | |
XX:MaxMetaspaceSize | 元空间最大内存 | 默认无限 |
设置参考
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m - XX:MaxMetaspaceSize=512m"
5.2 设置垃圾回收机制
- 串行收集器
- 并行收集器
- 并发收集器
- CMS收集器
- G1收集器
建议使用G1收集器(jdk1.7之后才有)
参数 | 描述 |
---|---|
-XX:+UseSerialGC | 启用串行收集器 |
-XX:+UseParallelGC | 启用并行垃圾收集器,配置了该选项,那么 -XX:+UseParallelOldGC默认启用 |
-XX:+UseParNewGC | 年轻代采用并行收集器,如果设置了 -XX:+UseConcMarkSweepGC选项,自动启动 |
-XX:ParallelGCThreads | 年轻代及⽼年代垃圾回收使⽤的线程数。默认值依赖于JVM使⽤的CPU个 数 |
XX:+UseConcMarkSweepGC(CMS) | 对于老年代,启用CMS垃圾收集器。 当并行收集器无法满足应用的延迟需求是,推荐使用CMS或G1收集器。启用该选项后, -XX:+UseParNewGC自动启用。 |
-XX:+UseG1GC | 启用G1收集器。 G1是服务器类型的收集器, 对于多核、大内存的机器。它在保持高吞吐量的情况下,高概率满足GC暂停时间的目标。 |
在bin/catalina.sh的脚本中 , 追加如下配置 :
JAVA_OPTS="-XX:+UseConcMarkSweepGC"
5.3 Tomcat
名称 | 说明 |
---|---|
maxConnections | 线程最大连接数,建议值2000,根据服务器配置来 |
maxThreads | 最大线程数 |
acceptCount | 最大的排队数,一台tomcat的最大请求数为maxConnections+acceptCount |