写点什么

6 道 tomcat 面试题,最后两道难倒我了

用户头像
田维常
关注
发布于: 2021 年 01 月 19 日
图片


即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了 6 道关于 tomcat 的核心面试题以及参看答案,看完对于绝大多数人应对面试妥妥的。


图片


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


默认端口为 8080,可以通过在 tomcat 安装包 conf 目录下,service.xml 中的 Connector 元素的 port 属性来修改端口。


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


这三种模式的不同之处如下:


BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7 版本或更低版本中,在 Linux 系统中默认使用这种方式。


NIO:利用 Java 的异步 IO 处理,可以通过少量的线程处理大量的请求。tomcat8.0.x 中默认使用的是 NIO。Tomcat7 必须修改 Connector 配置来启动:


<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"          connectionTimeout="20000" redirectPort="8443"/>


APR:即 Apache Portable Runtime,从操作系统层面解决 io 阻塞问题。Tomcat7 或 Tomcat8 在 Win7 或以上的系统中启动默认使用这种方式。


3、Tomcat 有几种部署方式?


  • 利用 Tomcat 的自动部署:把 web 应用拷贝到 webapps 目录(生产环境不建议放在该目录中)。Tomcat 在启动时会加载目录下的应用,并将编译后的结果放入 work 目录下。

  • 使用 Manager App 控制台部署:在 tomcat 主页点击“Manager App” 进入应用管理控制台,可以指定一个 web 应用的路径或 war 文件。

  • 修改conf/server.xml文件部署:在server.xml文件中,增加 Context 节点可以部署应用。

  • 增加自定义的 Web 部署文件:在conf/Catalina/localhost/路径下增加 xyz.xml 文件,内容是 Context 节点,可以部署应用。


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


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

  2. 在 servlet 注册时加上 1 如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。


5、tomcat 如何优化?


tomcat 作为 Web 服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:


掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存


服务器所能提供 CPU、内存、硬盘的性能对处理能力有决定性影响。


  • 对于高并发情况下会有大量的运算,那么 CPU 的速度会直接影响到处理速度。

  • 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize 等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于 full GC,从而导致处理能力严重下降。

  • 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。


利用缓存和压缩


  • 对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了 Nginx 作为缓存服务器,将图片、css、js 文件都进行了缓存,有效的减少了后端 tomcat 的访问。

  • 另外,为了能加快网络传输速度,开启 gzip 压缩也是必不可少的。但考虑到 tomcat 已经需要处理很多东西了,所以把这个压缩的工作就交给前端的 Nginx 来完成。

  • 除了文本可以用 gzip 压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从 300 多 kb 压缩到几十 kb,自己几乎看不出来区别。


采用集群


单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建 tomcat 集群是有效提升性能的手段。我们还是采用了 Nginx 来作为请求分流的服务器,后端多个 tomcat 共享 session 来协同工作。可以参考之前写的《利用 nginx+tomcat+memcached 组建 web 服务器负载均衡》。


优化线程数优化


找到 Connector port="8080" protocol="HTTP/1.1",增加 maxThreads 和 acceptCount 属性(使 acceptCount 大于等于 maxThreads),如下:


`<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

`


其中:


• maxThreads:tomcat可用于请求处理的最大线程数,默认是200• minSpareThreads:tomcat初始线程数,即最小空闲线程数• maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭• acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100
复制代码


使用线程池优化


在 server.xml 中增加 executor 节点,然后配置 connector 的 executor 属性,如下:


`<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>

<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

`


其中:


• namePrefix:线程池中线程的命名前缀• maxThreads:线程池的最大线程数• minSpareThreads:线程池的最小空闲线程数• maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭• threadPriority:线程优先级
复制代码


注:当 tomcat 并发用户量大的时候,单个 jvm 进程确实可能打开过多的文件句柄,这时会报 java.net.SocketException:Too many open files 错误。可使用下面步骤检查:


• ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001• lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数• 使用命令:ulimit -a 查看每个用户允许打开的最大文件数
复制代码


启动速度优化


  • 删除没用的 web 应用:因为 tomcat 启动每次都会部署这些应用。

  • 关闭 WebSocket:websocket-api.jar和tomcat-websocket.jar

  • 随机数优化:设置 JVM 参数:-Djava.security.egd=file:/dev/./urandom


内存优化


因为 tomcat 启动起来后就是一个 java 进程,所以这块可以参照 JVM 部分的优化思路。堆内存相关参数,比如说:


• -Xms:虚拟机初始化时的最小堆内存。


• -Xmx:虚拟机可使用的最大堆内存。-Xms 与-Xmx 设成一样的值,避免 JVM 因为频繁的 GC 导致性能大起大落 


• -XX:MaxNewSize:新生代占整个堆内存的最大值。


另外还有方法区参数调整(注意:JDK 版本)、垃圾收集器等优化。JVM 相关参数请看:手把手教你设置JVM调优参数


6、熟悉 tomcat 的哪些配置?


Context(表示一个 web 应用程序,通常为 WAR 文件,关于 WAR 的具体信息见 servlet 规范)标签。


docBase:该 web 应用的文档基准目录(Document Base,也称为 Context Root),或者是 WAR 文件的路径。可以使绝对路径,也可以使用相对于 context 所属的 Host 的 appBase 路径。


path:表示此 web 应用程序的 url 的前缀,这样请求的 url 为http://localhost:8080/path/****


reloadable:这个属性非常重要,如果为 true,则 tomcat 会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes 目录的变化,自动装载新的应用程序,我们可以在不重启 tomcat 的情况下改变应用程序。


useNaming:如果希望 Catalina 为该 web 应用使能一个 JNDI InitialContext 对象,设为 true。该 InitialialContext 符合 J2EE 平台的约定,缺省值为 true。


workDir:Context 提供的临时目录的路径,用于 servlet 的临时读/写。利用 javax.servlet.context.tempdir 属性,servlet 可以访问该目录。如果没有指定,使用 $CATALINA_HOME/work 下一个合适的目录。


swallowOutput:如果该值为 true,System.out 和 System.err 的输出被重定向到 web 应用的 logger。如果没有指定,缺省值为 false


debug:与这个 Engine 关联的 Logger 记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为 0。


host(表示一个虚拟主机)标签。


name:指定主机名。


appBase:应用程序基本目录,即存放应用程序的目录。


unpackWARs:如果为 true,则 tomcat 会自动将 WAR 文件解压,否则不解压,直接从 WAR 文件中运行应用程序。


Logger(表示日志,调试和错误信息)标签。


className:指定 logger 使用的类名,此类必须实现 org.apache.catalina.Logger 接口。


prefix:指定 log 文件的前缀。


suffix:指定 log 文件的后缀。


timestamp:如果为 true,则 log 文件名中要加入时间,如下例:localhost_log.2001-10-04.txt。


总结


本文一共六道关于 tomcat 的题目:


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

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

  • Tomcat 有几种部署方式?

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

  • tomcat 如何优化?熟悉 tomcat 的哪些配置?


再次回头想想你会几道呢?


「做人可以没天赋,但不能没斗志。」


推荐阅读


面试官:Mybatis中的设计模式有哪些?


有这本面试小抄,金三银四心里有底儿了!


面试官问我:能说几个常见的Linux性能调优命令吗?


《程序员面试宝典》.pdf下载


发布于: 2021 年 01 月 19 日阅读数: 41
用户头像

田维常

关注

关注公众号:Java后端技术全栈,领500G资料 2020.10.24 加入

关注公众号:Java后端技术全栈,领500G资料

评论

发布
暂无评论
6道tomcat面试题,最后两道难倒我了