Tomcat常见面试题你都知道答案吗?

Java面试题 专栏收录该内容
21 篇文章 0 订阅

海豚精灵https://www.whhtjl.com优课GOhttps://mgo.whhtjl.com

请解释将Tomcat作为一个Windows 服务运行会带来哪些好处?

1)自动启动:对于需要在维护后远程重新启动系统的环境来说,这是至关重要的;

2)启动无活动用户登录的服务器:Tomcat通常在刀片服务器上运行,这些服务器甚至可能没有一个活动监视器,Windows服务可以在没有活动用户的情况下启动;

3)安全性:在Windows服务下的Tomcat可以让您在一个特殊的系统帐户下运行它,这个账户可以从其他用户帐户中得到保护。

Tomcat有几种部署方式?

tomcat中四种部署项目的方法

第一种方法:
在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: 

<Context path="/hello" docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0" privileged="true"> 
</Context> 

至于Context 节点属性,可详细见相关文档。

第二种方法:
将web项目文件件拷贝到webapps 目录中。

第三种方法:
很灵活,在conf目录中,新建 Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为: 

<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true"> 
</Context>

第三种方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。

第二、三种还有个优点,可以定义一些个性配置,如数据源的配置等。

第四种方法,:
可以用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以。

请解释servlet如何完成生命周期?

 

  • 第一次访问Servlet,我们发现init()和service()都被调用了

 

  • 第二次访问Servlet,service()被调用了

 

  • 第三次访问Servlet,还是service()被调用了

 

  • 当我们关闭Tomcat服务器的时候,destroy()被调用了!

 

Servlet生命周期可分为5个步骤

  1. 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例;
  2. 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象;
  3. 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求;
  4. 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁;
  5. 卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
  • 简单总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。destroy()只有在Tomcat关闭的时候才会被调用。

tomcat有哪几种Connector运行模式?

Tomcat Connector有三种运行模式(BIO, NIO, APR)

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

  • BIO:

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

  • NIO:

利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 

connectionTimeout="20000" redirectPort="8443"/> 
  • APR:

即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。(安装方法:http://my.oschina.net/lsw90/blog/181161

官方对这三种的区别的详细说明:

                         Java Blocking Connector    Java Nio Blocking Connector    APR/native Connector 
                                           BIO                                  NIO                                         APR 
Classname                         AjpProtocol                      AjpNioProtocol                        AjpAprProtocol 
Tomcat Version                  3.x onwards                     7.x onwards                             5.5.x onwards 
Support Polling                  NO                                   YES                                         YES 
Polling Size                        N/A                                  maxConnections                      maxConnections 
Read Request Headers     Blocking                          Sim Blocking                            Blocking 
Read Request Body           Blocking                          Sim Blocking                           Blocking 
Write Response                 Blocking                           Sim Blocking                           Blocking 
Wait for next Request        Blocking                           Non Blocking                           Non Blocking 
Max Connections              maxConnections              maxConnections                      maxConnections 

Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:

  • Starting ProtocolHandler ["http-bio-8080"]
  • Starting ProtocolHandler ["http-nio-8080"]
  • Starting ProtocolHandler ["http-apr-8080"]

你平时怎么给tomcat调优?

第一步  – 提高JVM栈内存Increase JVM heap memory

你使用过tomcat的话,简单的说就是“内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解决这种问题.这种解决方法是通过增加JVM的栈内存实现的.也就是说,JVM通常不去调用垃圾回收器,所以服务器可以更多关注处理web请求,并要求尽快完成。要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息:

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
	-server -Xms1024m -Xmx1024m
	-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
	-XX:MaxPermSize=512m -XX:+DisableExplicitGC"

-Xms – 指定初始化时化的栈内存

-Xms – 指定初始化时化的栈内存

-Xmx – 指定最大栈内存

在重启你的Tomcat服务器之后,这些配置的更改才会有效。下面将介绍如何处理JRE内存泄漏.  

第二步 – 解决JRE内存泄露

性能表现不佳的另一个主要原因是内存泄漏,正如我之前说过:始终使用最新的tomcat服务器以获得更好的性能和可伸缩性。现在,这句话变成真的。如果我们使用最新的tomcat版本6.0.26及以上就可以解决这个错误,因为它包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听器是,

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

你可以在server.xml文件中找到这个监听器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下来,我们将看看如何调整连接属性“maxThreads”。

第三步 – 线程池设置

线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置。maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值。

<Connector port="8080" address="localhost"

 maxThreads="250" maxHttpHeaderSize="8192"

 emptySessionPath="true" protocol="HTTP/1.1"

 enableLookups="false" redirectPort="8181" acceptCount="100"

 connectionTimeout="20000" disableUploadTimeout="true" />

在上述配置中,maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下:​​

org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are

currently busy, waiting. Increase maxThreads (250) or check the servlet status

如果应用提示上述错误,务必检查上述错误是否是由于单个请求花费太长时间造成的,这个问题的原因是这样的,有时候如果数据库连接不释放的话,进程将不会处理其它请求。  

注意: 如果请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它意外着最好使用“Tomcat集群”的多个实例。也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。

根据我的经验,准确值的设定可以通过将应用在在各种环境中测试得出。接下来,我们来看看如何压缩的MIME类型。

第四步- 压缩

Tomcat有一个通过在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成:

<Connector port="8080" protocol="HTTP/1.1"

 connectionTimeout="20000"

 redirectPort="8181" compression="500"

 compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />

在前面的配置中,当文件的大小大于等于500bytes时才会压缩。如果当文件达到了大小但是却没有被压缩,那么设置属性compression="on"。否则Tomcat默认设置是“off”。接下来我们将看看如何调优数据库。  

第五步- 数据库性能调优

Tomcat性能在等待数据库查询被执行期间会降低。如今大多数应用程序都是使用可能包含“命名查询”的关系型数据库。如果是那样的话,Tomcat会在启动时默认加载命名查询,这个可能会提升性能。另一件重要事是确保所有数据库连接正确地关闭。给数据库连接池设置正确值也是十分重要的。我所说的值是指Resource要素的最大空闲数(maxIdle),最大连接数(maxActive),最大建立连接等待时间(maxWait)属性的值。因为配置依赖与应用要求,我也不能在本文指定正确的值。你可以通过调用数据库性能测试来找到正确的值。  

第六步 – Tomcat原生库

Tomcat的原生库基于Apache可移植运行时(Apache Portable Runtime简称APR),给程序员提供了超强的扩展性和性能,在产品运作中帮助融合原生的服务器技术以展现最佳的性能。想知道安装说明的朋友请参考Tomcat Native Library – (APR) Installation。 

第七步 – 其他选项

这些选项是:

  • 开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推动整体性能。
  • 每当开机时,Tomcat服务器应当自动地重启。
  • 一般情况下HTTPS请求会比HTTP请求慢。如果你想要更好的安全性,即使慢一点我们还是要选择HTTPS。  

Tomcat顶层架构小结

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container; 

(2) Server掌管着整个Tomcat的生死大权; 

(3)Service 是对外提供服务的; 

(4)Connector用于接受请求并将请求封装成Request和Response来具体处理; 

(5)Container用于封装和管理Servlet,以及具体处理request请求。

参考文章:Tomcat 优化方案 和 配置详解

 

  • 5
    点赞
  • 1
    评论
  • 42
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值