Tomct面试题(15道含答案)
1. Tomcat 默认端口是多少?如何修改?
- 默认 HTTP 端口:
8080 - 修改步骤:
- 进入 Tomcat 安装目录下的
conf/文件夹; - 打开
server.xml文件; - 找到如下
<Connector>配置:<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /> - 将
port="8080"修改为所需端口(如8081); - 保存并重启 Tomcat。
- 进入 Tomcat 安装目录下的
✅ 注意:若修改 HTTPS 端口(默认 8443),需同步修改对应的
<Connector>配置。
2. Tomcat 有哪几种 Connector 运行模式?(IO 模型)
Tomcat 支持四种主要的 IO 模型,用于优化高并发性能:
| 模式 | 全称 | 特点 | 适用场景 |
|---|---|---|---|
| BIO | Blocking I/O | 同步阻塞,每个请求一个线程 | 低并发、简单应用(Tomcat 6 及以前默认) |
| NIO | Non-blocking I/O | 同步非阻塞,基于 Selector 多路复用 | 中高并发(Tomcat 7+ 默认) |
| NIO2 / AIO | Asynchronous I/O | 异步非阻塞(JDK 7+) | 理论高性能,但实际支持有限 |
| APR | Apache Portable Runtime | 基于 JNI 调用本地库(需安装 APR/native) | 极致性能,尤其静态文件处理 |
配置示例(启用 NIO):
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="500"minSpareThreads="100"maxSpareThreads="200"acceptCount="200"connectionTimeout="20000"enableLookups="false"URIEncoding="UTF-8"compression="on"compressionMinSize="10240"compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />关键参数说明:
maxThreads:最大工作线程数(默认 200,建议 400~800);minSpareThreads:初始化空闲线程数;acceptCount:当所有线程忙时,等待队列长度(默认 100);enableLookups="false":关闭 DNS 反向解析,提升性能;compression:启用 Gzip 压缩,减少网络流量。
3. Tomcat 有哪几种部署方式?
自动部署(推荐开发环境)
将 WAR 包或项目目录直接放入webapps/目录,Tomcat 启动时自动解压部署。在
server.xml中配置<Context><Host name="localhost" appBase="webapps"><Context path="/myapp" docBase="/path/to/myapp" reloadable="true"/> </Host>⚠️ 不推荐生产使用,修改需重启。
独立 Context 配置文件(推荐生产)
在conf/Catalina/localhost/下创建myapp.xml:<Context docBase="/opt/apps/myapp" />- 文件名即为访问路径(如
myapp.xml→http://host:port/myapp); - 无需重启 Tomcat,热加载支持更好。
- 文件名即为访问路径(如
4. Tomcat 如何创建 Servlet 实例?原理是什么?
- 加载时机:
- 若
<load-on-startup>值 ≥ 0:容器启动时通过反射实例化; - 若未设置或为负数:首次请求时懒加载。
- 若
- 原理:
- 解析
web.xml或注解(如@WebServlet); - 使用 ClassLoader 加载 Servlet 类;
- 通过 Java 反射机制 调用构造器创建实例;
- 调用
init()方法完成初始化。
- 解析
✅ 每个 Servlet 在整个应用生命周期中 仅有一个实例(单例模式)。
5. Tomcat 性能优化策略
(1)连接器优化(server.xml)
- 启用 NIO/APR;
- 调整线程池参数(
maxThreads,acceptCount); - 关闭
enableLookups; - 开启 Gzip 压缩;
- 设置
URIEncoding="UTF-8"避免中文乱码。
(2)JVM 内存调优(catalina.sh / catalina.bat)
JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx2g -Xss256k"(3)其他优化
- 禁用 TLD 扫描(加快启动):
<Context tldValidation="false" /> - 使用外部 Web 服务器(如 Nginx)处理静态资源;
- 启用 Access Log 缓冲(减少磁盘 I/O)。
6. JVM 内存调优参数(JAVA_OPTS)
| 参数 | 说明 |
|---|---|
-Xms2g | 初始堆内存 |
-Xmx2g | 最大堆内存(建议与 Xms 相同,避免动态扩容) |
-Xmn1g | 年轻代大小 |
-Xss256k | 线程栈大小(减小可支持更多线程) |
-XX:NewRatio=3 | 老年代 : 年轻代 = 3:1 |
-XX:SurvivorRatio=8 | Eden : Survivor = 8:1(两个 Survivor) |
-XX:+UseG1GC | 使用 G1 垃圾回收器(JDK8+ 推荐) |
7. 垃圾回收(GC)策略调优
| 场景 | 推荐 GC | 参数 |
|---|---|---|
| 吞吐量优先 | Parallel GC | -XX:+UseParallelGC -XX:+UseParallelOldGC |
| 响应时间优先 | CMS / G1 | -XX:+UseConcMarkSweepGC 或 -XX:+UseG1GC |
| 低延迟(JDK11+) | ZGC / Shenandoah | -XX:+UseZGC |
✅ 生产环境建议使用 G1GC(平衡吞吐与延迟)。
8. Session 共享方案(集群环境)
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| Session 复制 | Tomcat 自动广播 Session | 配置简单 | 网络开销大,节点多时性能差 |
| Memcached + MSM | Session 存入 Memcached | 高性能、可扩展 | 依赖外部服务,需引入 jar |
| Sticky Session(粘性会话) | Nginx/Apache 将同一用户请求固定到某台 Tomcat | 无需共享 Session,效率高 | 单点故障风险,不适用于强一致性场景 |
🔗 参考:
- Session 复制:ajita.iteye.com/blog/1715312
- MSM 方案:ajita.iteye.com/blog/1716320
- Sticky Session:ajita.iteye.com/blog/1848665
9. 启用 JMX 远程监控
在 catalina.sh 中添加 JVM 参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.71.38✅ 可通过
jconsole或VisualVM远程监控 Tomcat。
10. 常用监控与分析工具
- jconsole:JDK 自带,查看内存、线程、MBean;
- jvisualvm:功能更强,支持插件(如 VisualGC);
- Lambda Probe:Tomcat 专用 Web 监控界面;
- JProfiler / YourKit:商业级性能分析;
- IBM ISA:IBM 提供的深度诊断工具。
11–13. 监控与日志
- 查看 Session 数:通过 Tomcat Manager 或 Lambda Probe;
- 内存监控:
jconsole、jvisualvm; - GC 日志开启:
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/path/to/gc.log - 类加载监控:
-verbose:class -verbose:gc
14. 一个请求的完整处理流程
以 Nginx + Tomcat 为例:
- 用户访问
http://wo.de.tian/yy/index.jsp; - DNS 解析到 Nginx IP;
- Nginx 根据
location /yy/转发到后端 Tomcat 集群(如10.99.99.99:8080); - Tomcat 的 Coyote Connector 接收请求;
- 请求交给 Engine → Host(localhost)→ Context(/yy);
- Context 根据 URL 映射找到 JspServlet;
- 创建
HttpServletRequest/HttpServletResponse; - 调用
JspServlet.service(); - 响应逐层返回至 Connector,最终返回浏览器。
🔄 整个过程体现了 Tomcat 的 组件化架构:Server → Service → Engine → Host → Context → Wrapper(Servlet)。
15. Tomcat 工作模式
Tomcat 作为 Servlet 容器,有三种集成模式:
| 模式 | 说明 |
|---|---|
| 独立模式 | Tomcat 直接对外提供 HTTP 服务(开发/测试常用) |
| 进程内模式 | 作为 Apache 的 mod_jk 模块嵌入运行(已淘汰) |
| 进程外模式(反向代理) | 前端 Nginx/Apache 接收请求,转发给后端 Tomcat(生产主流) |
✅ 当前最佳实践:Nginx(静态资源 + 负载均衡) + Tomcat(动态处理)
