即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了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的哪些配置?

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

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

推荐阅读:

由浅入深逐步了解 Synchronized

我竟然被“双亲委派”给虐了

面试官留步!听我跟你侃会儿Docker原理

顺丰快递:请签收MySQL灵魂十连

讲解 Zookeeper 的五个核心知识点

欢迎关注微信公众号:互联网全栈架构,收取更多有价值的信息。

这几道tomcat面试题,最后两道难倒我了相关推荐

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

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

  2. 6道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. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)
  2. 在Linux上编译安装php开发环境(install mysql5.6)-3
  3. Win32 多线程学习总结
  4. 《大话数据结构》第3章 线性表 3.8.2 单链表的删除
  5. JDBC与mysql同为CST时区导致数据库时间和客户端时间差13或者14小时
  6. opentack-openstack组件及功能(1)
  7. cacls 使用方法
  8. 【ubuntu-anaconda-dlib】undefined symbol: _ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESa
  9. JS异步模式与Promise模式
  10. 【LeetCode】剑指 Offer 19. 正则表达式匹配
  11. ubuntu 编译 hercules 主机安装 z/OS 教程
  12. 【java与智能设备】单选框 复选框 监听事件
  13. mac os adb下载
  14. tp5阿里云短信验证码
  15. 基于Springboot的个人健康监控管理系统
  16. 第十四周助教心得体会
  17. §6.5 分离性公理与子空间,(有限)积空间和商空间
  18. Python: 计算百分比
  19. 四旋翼无人机动力学模型及控制
  20. 【日常训练】2019-10-24am_xjoi结界[生与死的境界]/codeforces878E_贪心

热门文章

  1. 二维表转换为一维列表
  2. 输入一串字符,并判断其中英文字符和数字字符的个数——C语言实现(C语言练习)
  3. RIL.java【2】
  4. 二叉搜索树:红黑树的原理和实现
  5. 【服务器数据恢复】服务器硬盘进水后服务器崩溃的数据恢复案例
  6. 详解vue路由传参的三种方式
  7. 手把手带你爬取猫眼电影,正则解析
  8. python3中正确代码报红显示Indent expected
  9. C#入门4——计算自由落体运动
  10. 爬取热门微博数据2018.3.27更新