即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了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:当所有可以使用的处理请求的线程数都被使用时

使用线程池优化

在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的哪些配置?

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

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

回复干货】获取精选干货视频教程

回复加群】加入疑难问题攻坚交流群

回复mat】获取内存溢出问题分析详细文档教程

回复赚钱】获取用java写一个能赚钱的微信机器人

回复副业】获取程序员副业攻略一份

都收藏了,就点个「在看」支持一下吧!

点下在看,你最好看

6道tomcat面试题,最后两道真不会相关推荐

  1. 【2022最新Java面试宝典】—— Tomcat面试题(15道含答案)

    目录 1. Tomcat的缺省端口是多少,怎么修改? 2. tomcat 有哪几种Connector 运行模式(优化)? 3. Tomcat有几种部署方式? 4. tomcat容器是如何创建servl ...

  2. 这几道tomcat面试题,最后两道难倒我了

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

  3. 网易有道java面试题,网易有道-Java岗-一面面经

    全程40分钟出头 自我介绍 Java抽象类与接口有什么区别 接口里面的方法默认是什么类型的 接口里面可以什么都不写 抽象类里面呢 抽象类可以是final的吗 JVM内存结构,各个部分的作用是什么 堆和 ...

  4. 【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)

    目录 一.Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 2. 为什么说java是跨平台语言 3. Jdk和Jre和JVM的区别 4. 说一下 JVM由那些部分组成,运行流程 ...

  5. 【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)

    目录 一.基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有 ...

  6. 【2022最新Java面试宝典】—— Redis面试题(70道含答案)

    目录 一.概述 1. 什么是Redis? 2. Redis有哪些优缺点? 3. 使用redis有哪些好处? 4. 为什么要用 Redis / 为什么要用缓存 5. 为什么要用 Redis 而不用 ma ...

  7. 【2022最新Java面试宝典】—— MySQL面试题(40道含答案)

    目录 1.MySQL 中有哪几种锁? 2.MySQL 中有哪些不同的表格? 3.简述在MySQL 数据库中 MyISAM 和InnoDB 的区别 4.MySQL 中InnoDB 支持的四种事务隔离级别 ...

  8. 【2022最新Java面试宝典】—— MyBatis面试题(37道含答案)

    目录 一.MyBatis简介 1. MyBatis是什么? 2. Mybatis优缺点 3. Hibernate 和 MyBatis 的区别 4. 为什么说Mybatis是半自动ORM映射工具?它与全 ...

  9. 【2022最新Java面试宝典】—— Spring面试题(75道含答案)

    目录 1. Spring概述 1.1 什么是spring? 1.2 Spring的俩大核心概念 1.3 Spring框架的设计目标,设计理念,和核心是什么 1.4 Spring的优缺点是什么? 1.5 ...

最新文章

  1. 红旗linuxcentos_用红旗Linux 11的体验报告,附使用红旗Linux 11截图
  2. 别在 Java 代码里乱打日志了,这才是打印日志的正确姿势!
  3. latex 表格单元格上下左右居中_Excel文字对齐技巧:学会这6种方式,快速整理规范表格...
  4. Boost:使用find_if()算法来检测两个向量交叉的点
  5. 最大化窗口设置_BetterTouchTool的几个实用设置
  6. 你最擅长哪种数学思维?
  7. SpringBoot中 pagehelper插件使用
  8. 华为鸿蒙OS用户今年底或达2亿 将发布自研鸿蒙编程语言
  9. signature=51b3a9ac95339489ef7384c6e21e303f,nginx – Let’s Encrypt的中间证书
  10. 理解promise、async 和await之间的执行关系
  11. [2018.12.6]左偏树
  12. 论文笔记_S2D.06-2018-BMVC-用于实时语义分割的轻量级精细网络RefineNet
  13. CondaHTTPError: HTTP 000 CONNECTION FAILED for url ...... 解决过程
  14. php gmssl,gmssl
  15. Sass Module 介绍
  16. 【人在运维囧途_14】打扫干净屋子再请客
  17. 搜索结果Refinement 行为总结之 multi-selection refinement
  18. YII2框架AJAX请求报500错误的处理方法
  19. centos7 时间自动同步
  20. java文本框输入数字_Java 文本框输入数字限制以及输入数字大小限制

热门文章

  1. 永远的颠覆者——奇虎360董事长周鸿祎专访
  2. 未来计算机大数据的发展方向
  3. python列表习题
  4. Mysql limit用法
  5. python散点图怎么显示点的值_Python散点图如何查看每个点的条目数
  6. AndroidStudio中使用Aliyun Maven
  7. 八: 操作提示(wxml 即将废弃)
  8. JavaScript算法——插入排序
  9. linux的lvcreate语句,linux中使用命令 vgcreate、lvcreate 和 lvextend 管理和创建 LVM
  10. 魔兽世界开服教程wow服务器框架Trinirycore构建