其他分享
首页 > 其他分享> > 锁屏面试题百日百刷-tomcat优化相关

锁屏面试题百日百刷-tomcat优化相关

作者:互联网

锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cc/#/introductionPage。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步,吊打面试官!接下来的是今日的面试题:

 

 

====tomcat优化经验?

 

优化连接配置.这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,修改连接数,关闭客 户端dns查询。

 

参数解释: URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞 个mod_encoding,还要手工编译 maxSpareThreads : 如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总 数。minSpareThreads : 最小备用线程数,tomcat启动时的初始化的线程数。 enableLookups : 这个功效和Apache中的HostnameLookups一样,设为关闭。 connectionTimeout : connectionTimeout为网络连接超时时间毫秒数。 maxThreads : maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大 的线程数,即最大并发数。 acceptCount : acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个 acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection maxProcessors与minProcessors : 在 Java中线程是程序运行时的路径,是在一个程序中与其它控制 线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高 效程序,使空闲时间保持最低,从而接受更多的请求。 通常Windows是1000个左右,Linux是2000个左右。 useURIValidationHack: 我们来看一下tomcat中的一段源码:

 

【security】

 

if (connector.getUseURIValidationHack()) {

 

String uri = validate(request.getRequestURI());

 

if (uri == null) {

 

res.setStatus(400);

 

res.setMessage(“Invalid URI”);

 

throw new IOException(“Invalid URI”);

 

} else {

 

req.requestURI().setString(uri);

 

// Redoing the URI decoding

 

req.decodedURI().duplicate(req.requestURI());

 

req.getURLDecoder().convert(req.decodedURI(), true);

 

可以看到如果把useURIValidationHack设成”false”,可以减少它对一些url的不必要的检查从而减省开

 

销。

 

enableLookups=”false” : 为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改

 

server.xml文件中的enableLookups参数值。

 

disableUploadTimeout :类似于Apache中的keeyalive一样

 

给Tomcat配置gzip压缩(HTTP压缩)功能

 

compression=”on” compressionMinSize=”2048″

 

compressableMimeType=”text/html,text/xml,text/JavaScript,text/css,text/plain”

 

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,

 

再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,javascript ,

 

Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP

 

, Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。

 

1)compression=”on” 打开压缩功能

 

2)compressionMinSize=”2048″ 启用压缩的输出内容大小,这里面默认为2KB

 

3)noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩

 

4)compressableMimeType=”text/html,text/xml” 压缩类型

 

最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端 口这个段的配置:

 

<!–enable tomcat ssl–>

 

<Connector port=”8443″ protocol=”HTTP/1.1″

 

URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”75″

 

enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″

 

acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″

 

useURIValidationHack=”false”

 

compression=”on” compressionMinSize=”2048″

 

compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

 

SSLEnabled=”true”

 

scheme=”https” secure=”true”

 

clientAuth=”false” sslProtocol=”TLS”

 

keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”/>

 

 

 

====tomcat内存调优?

 

内存方式的设置是在catalina.sh中,调整一下JAVA_OPTS变量即可,因为后面的启动参数会把

 

JAVA_OPTS作为JVM的启动参数来处理。

 

具体设置如下:

 

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -

 

XX:SurvivorRatio=4"

 

其各项参数如下:

 

-Xmx3550m:设置JVM最大可用内存为3550M。

 

-Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

 

-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大

 

小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆

 

的3/8。

 

-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

 

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为

 

4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

 

-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区 与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

 

-XX:MaxPermSize=16m:设置持久代大小为16m。

 

-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor

 

区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对

 

象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

 

 

 

====Tomcat中垃圾回收策略调优?

 

垃圾回收的设置在catalina.sh中,调整JAVA_OPTS变量。

 

具体设置如下:

 

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC -

 

XX:MaxGCPauseMillis=100"

 

具体的垃圾回收策略及相应策略的各项参数如下:

 

串行收集器(JDK1.5以前主要的回收方式) 

 

-XX:+UseSerialGC:设置串行收集器

 

并行收集器(吞吐量优先) 

 

示例:

 

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -

 

XX:MaxGCPauseMillis=100

 

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使

 

用并发收集,而年老代仍旧使用串行收集。

 

-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最

 

好配置与处理器数目相等。

 

-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集

 

-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调

 

整年轻代大小,以满足此值。

 

-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的 Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直 打开。

 

并发收集器(响应时间优先) 

 

示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC

 

-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失

 

效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。

 

-XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置

 

自行设置,所以无需再设置此值。

 

-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间

 

以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。

 

-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

 

 

 

====Tomcat一个请求的完整过程

 

配置如下:

 

Ng:(nginx)

 

upstream yy_001{

 

server 10.99.99.99:8080;

 

server 10.99.99.100:8080;

 

hash $**;

 

healthcheck_enabled;

 

healthcheck_delay 3000;

 

healthcheck_timeout 1000;

 

healthcheck_failcount 2;

 

healthcheck_send 'GET /healthcheck.html HTTP/1.0' 'Host: wo.com'

 

'Connection: close';

 

}

 

server {

 

include base.conf;

 

server_name wo.de.tian;

 

...

 

location /yy/ {

 

proxy_pass http://yy_001;

 

}

 

首先 dns 解析 wo.de.tian机器,一般是ng服务器ip地址

 

然后 ng根据server的配置,寻找路径为 yy/的机器列表,ip和端口

 

最后 选择其中一台机器进行访问—->下面为详细过程

 

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得

 

2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应

 

3) Engine获得请求localhost/yy/index.jsp,匹配它所拥有的所有虚拟主机Host

 

4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)

 

5) localhost Host获得请求/yy/index.jsp,匹配它所拥有的所有Context

 

6) Host匹配到路径为/yy的Context(如果匹配不到就把该请求交给路径名为”“的Context去处理)

 

7) path=”/yy”的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet

 

8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类

 

9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet

 

或doPost方法

 

10)Context把执行完了之后的HttpServletResponse对象返回给Host

 

11)Host把HttpServletResponse对象返回给Engine

 

12)Engine把HttpServletResponse对象返回给Connector

 

13)Connector把HttpServletResponse对象返回给客户browser

 

 

 

更多面试题可关注"demo锁屏面试题"公众号通过小程序或App获取面试题和学习资源

 

标签:面试题,tomcat,收集器,text,锁屏,XX,线程,设置
来源: https://www.cnblogs.com/demosoftware/p/15054150.html