ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-23 23:35:39  阅读:143  来源: 互联网

标签:面试题 tomcat 收集器 text 锁屏 XX 线程 设置


锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有