Java面试必问的14道Tomcat调优真题,你都学会了吗?

357 阅读5分钟

前言

在工作中,作为 Java 开发的程序员,Tomcat 服务器是大家常用的,也是很多公司现在正在用的。但是,在系统并发量比较大的情况下,Tomcat 就会出现卡死和自动关闭等问题。如何优化 Tomcat,这也是面试官经常问的问题。

1、Tomcat的缺省端口是多少,怎么修改?

1)找到Tomcat目录下的conf文件夹

2)进入conf文件夹里面找到server.xml文件

3)打开server.xml文件

4)在server.xml文件里面找到下列信息

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" uriEncoding="utf-8"/>
port="8080"改成你想要的端口

2、tomcat 有哪几种Connector 运行模式(优化)?

  • bio:传统的Java I/O操作,同步且阻塞IO。
  • maxThreads="150"//Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。
  • minSpareThreads="25"---Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。
  • maxSpareThreads="75"--一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数*每秒用户操作次数*系统平均操作时间” 来计算。
  • acceptCount="100"----指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。
  • connectionTimeout="20000" --网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
  • nio:JDK1.4开始支持,同步阻塞或同步非阻塞IO。
  • 指定使用NIO模型来接受HTTP请求
  • protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型来接受HTTP请
  • 求。默认是BlockingIO,配置为protocol="HTTP/1.1"
  • acceptorThreadCount="2" 使用NIO模型时接收线程的数目
  • aio(nio.2):JDK7开始支持,异步非阻塞IO。
  • apr:Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地 提高Tomcat对静态文件的处理性能。
<!--
<Connector connectionTimeout="20000" port="8000" protocol="HTTP/1.1"
redirectPort="8443" uriEncoding="utf-8"/>
-->
<!-- protocol 启用 nio模式,(tomcat8默认使用的是nio)(apr模式利用系统级异步io) -->
<!-- minProcessors最小空闲连接线程数-->
<!-- maxProcessors最大连接线程数-->
<!-- acceptCount允许的最大连接数,应大于等于maxProcessors-->
<!-- enableLookups 如果为true,requst.getRemoteHost会执行DNS查找,反向解析ip对应域
名或主机名-->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443
maxThreads=“500”
minSpareThreads=“100”
maxSpareThreads=“200”
acceptCount="200"
enableLookups="false"
/>

其他配置

  • maxHttpHeaderSize="8192" http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
  • URIEncoding="UTF-8" 指定Tomcat容器的URL编码格式。
  • disableUploadTimeout="true" 上传时是否使用超时机制
  • enableLookups="false"--是否反查域名,默认值为true。为了提高处理能力,应设置为false
  • compression="on" 打开压缩功能
  • compressionMinSize="10240" 启用压缩的输出内容大小,默认为2KB
  • noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩
  • compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩

3、Tomcat有几种部署方式?

1)直接把Web项目放在webapps下,Tomcat会自动将其部署

2)在server.xml文件上配置节点,设置相关的属性即可

3)通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。

编写XML的方式来进行设置。

4、tomcat容器是如何创建servlet类实例?用到了什么原理?

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。

(有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

5.tomcat 如何优化?

6.内存调优

7.垃圾回收策略调优

8.添加JMS远程监控

9.专业点的分析工具有

IBM ISA,JProfiler、probe 等,具体监控及分析方式去网上搜索即可

10.关于Tomcat的session数目

这个可以直接从Tomcat的web管理界面去查看即可 ;

或者借助于第三方工具Lambda Probe来查看,它相对于Tomcat自带的管理稍微多了点功能,但也不多 ;

11.监视Tomcat的内存使用情况

使用JDK自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等; JDK自带的jvisualvm可以下载插件(如GC等),可以查看更丰富的信息。

如果是分析本地的Tomcat的话, 还可以进行内存抽样等,检查每个类的使用情况

12.打印类的加载情况及对象的回收情况

13.Tomcat一个请求的完整过程

14.Tomcat工作模式?

笔者回答:Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容 器、进程内的Servlet容器和进程外的Servlet容器。

进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:

  • Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
  • Tomcat作为独立服

15.共享session处理

总结

为了不影响大家的阅读体验,这篇Tomcat调优真题笔记已经为大家打包好了,希望这份面试笔记可以帮助大小伙伴愉快的通过面试,当然以上的面试真题仅供参考!