目录
3:container,在tomcat中共有四个,每一个都有标准的实现。
2:如果项目是一个非页面项目,可以考虑不适用jasper功能
写在前面
Tomcat作为一个动态的web容器,可以提供稳定的,便携的容器服务,是运行在JVM上面的。
体系架构
1:tomcat:web的servlet容器
2:connector
负责接收外部的请求,并封装成 request,将结果传输到 container 进行处理,可以进行对接外部传输协议的选择
protocol :协议可以选择
org.apache.coyote.http11.Http11NioProtocol 基于jvm
org.apache.coyote.http11.Http11Nio2Protocol 基于jvm
org.apache.coyote.http11.Http11AprProtocol 基于操作系统
在tomcat 8.5.x 中去除了 bio(oio)模型,默认使用NIO模型
3:container,在tomcat中共有四个,每一个都有标准的实现。
接收到connector封装好的 request 并进行逻辑出来,最终调用 service方法
engine 引擎
host 主机
context
真正处理逻辑的组件,在这个里面可以对项目进行加载, webapp加载
wrapper
启动流程
org.apache.catalina.startup.Bootstrap#init()
org.apache.catalina.startup.Bootstrap#initClassLoaders
org.apache.catalina.startup.Bootstrap#createClassLoader(String name, ClassLoader parent) 由 catalina.properties 决定
org.apache.catalina.startup.Bootstrap#commonLoader
org.apache.catalina.startup.Bootstrap#catalinaLoader
org.apache.catalina.startup.Bootstrap#sharedLoader
双亲委派
1:tomcat双亲委派模型图
2:在tomcat在加载webapp的时候,其实是破坏了双亲委派模型的,所以能够保证一个tomcat可以同时跑多个应用
tomcat优化
Tomcat优化的几个角度
1:在连接器方面
connector:protocol
在tomcat8.5中默认使用的NIO模型
我们开发人员可以选择的协议有
(NIO)org.apache.coyote.http11.Http11NioProtocol - non blocking Java NIO connector
(AIO)org.apache.coyote.http11.Http11Nio2Protocol - non blocking Java NIO2 connector
(APR)org.apache.coyote.http11.Http11AprProtocol - the APR/native connector
在性能上来说 APR>AIO>NIO>BIO(OIO)
选择顺序最好从 左--->右
connector:executor
tomcat默认的线程池的大小是200,我们可以使用指定的线程池来优化tomcat的吞吐量
2:如果项目是一个非页面项目,可以考虑不适用jasper功能
3:jvm层面
tomcat是运行在jvm上面的,所以我们是可以设jvm参数的,官方建议设置 Xms = Xmx = 物理内存的70%-80*%
1:Xms = Xmx 避免jvm的堆过小,频繁发生GC的情况发生
2:物理内存的70%-80% 官网文档指出的 你懂得
4:避免开启不需要的日志
5:热加载可以关闭 <Context reloadable="true">