- Tomcat 就是一个 servlet容器,用于在第一次请求时加载和实例化(如果特殊指定,则在容器启动时进行加载)。
- servlet 一经加载,一般不会从容器中删除,直至应用服务器关闭或重新启动。但当容器做存储器回收动作时,servlet有可能被删除。也正是因为这个原因,第一次访问servlet所用的时间要大大多于以后访问所用的时间。
- Tomcat的主要组件有:服务器server,服务service,连接器connector,容器container;其中 连接器和 容器 时 Tomact的两大核心
- 一个服务器Server 有多个 服务,一个服务有多个 连接器 和 一个 容器。
- 一个 连接器 Connector 用于监听指定端口的 客户请求,接收tcp连接的。
它里面通过ProtocolHandler
来处理请求:将接收到的Socket通过 TCP/IP 和 HTTP 协议封装成 Request 或者 Response 对象 传给 容器 Container - 通过request 在容器Container中的
Context容器
找到合适的servlet 。servlet 实例 是在Wrapper容器
创建的,如HTTPServlet
,调用doPost 或 doGet
进行处理业务逻辑 ,返回给 Connector 再通过Socket 返回给 客户。 - 上面再细点说,Container 是一个责任链模式的一个管道,在其中某一部分会调用
doFilter
方法,其中会调用 servlet 的 service方法,即doPost 或 doGet
秋招加油啊~~
主要看这个:https://www.jianshu.com/p/76ff17bc6dea
https://zh.wikipedia.org/wiki/Java_Servlet
https://blog.csdn.net/u014231646/article/details/79482195
https://blog.csdn.net/ThinkWon/article/details/104397665
哦,再补充一些
8. Tomcat 9 不再支持 BIO了,支持NIO(默认支持)和 APR。NIO:通过selector 监听就绪的事件交给线程池,完成相应的处理,如生成httpservlet,完成socket读写(没有返回到主selector)。
NIO只是优化了网络IO的读写,如果系统的瓶颈不在这里,比如每次读取的字节说都是500b,那么BIO和NIO在性能上没有区别。NIO模式是最大化压榨CPU,把时间片都更好利用起来。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源如内存,有关线程资源可参照这篇文章《一台java服务器可以跑多少个线程》。因此,使用的线程越少越好。而I/O复用模型正是利用少量的线程来管理大量的连接。在对于维护大量长连接的应用里面更适合用基于I/O复用模型NIO,比如web qq这样的应用。所以我们要清楚系统的瓶颈是I/O还是CPU的计算。
深度解读Tomcat中的NIO模型 -
作者:新栋BOOK
https://www.jianshu.com/p/76ff17bc6dea
嗐,华为面试一直纠结我的Tomcat服务器的并发问题,这里再次补充以下:
主要还是关于线程池的连接数的问题或者是轮询加锁时产生的死锁问题