当前位置: 首页 > 后端技术 > Java

锁屏面试题100天一百天-tomcat优化相关

时间:2023-04-01 19:34:41 Java

锁屏面试题一百天一百天,每个工作日持续更新面试题。锁屏面试题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一样,设置为off。connectionTimeout:connectionTimeout是以毫秒为单位的网络连接超时。maxThreads:maxThreadsTomcat使用一个线程来处理它收到的每个请求。该值表示Tomcat最多可以创建的线程数,即最大并发数。acceptCount:acceptCount的意思是当线程数达到maxThreads时,后续的请求会被放入等待队列。这个acceptCount是队列的大小。如果队列也满了,直接拒绝连接它们共享相同的地址空间。多线程帮助程序员编写高效的程序,最大限度地提高CPU利用率,将空闲时间保持在最低限度,并接受更多请求。通常Windows是1000左右,Linux是2000左右。useURIValidationHack:让我们看一下tomcat中的一段源代码:[security]if(connector.getUseURIValidationHack()){Stringuri=validate(request.getRequestURI());如果(uri==null){res.setStatus(400);res.setMessage("无效的URI");抛出新的IOException("无效的URI");}else{req.requestURI().setString(uri);//重做URI解码req.decodedURI().duplicate(req.requestURI());req.getURLDecoder().convert(req.decodedURI(),true);可以看到,如果将useURIValidationHack设置为“false”,就可以减少一些url上不必要的检查,减少开销。enableLookups=”false”:为了消除DNS查询对性能的影响,我们可以通过修改server.xml文件中enableLookups参数的值来关闭DNS查询。disableUploadTimeout:类似Apache中的keeyalive,为Tomcat配置gzip压缩(HTTP压缩)功能plain”HTTP压缩可以大大提高浏览网站的速度。其原理是客户端请求网页后,从服务器端压缩网页文件,然后下载到客户端,由客户端的浏览器负责解压浏览。与HTML、CSS、javascript、Text等正常浏览流程相比,可节省约40%的流量。更重要的是,它还可以压缩动态生成的网页,包括CGI、PHP、JSP、ASP、Servlet、SHTML等,压缩效率惊人。1)compression=”on”开启压缩功能2)compressionMinSize=”2048″开启压缩输出内容大小,默认为2KB3)noCompressionUserAgents=”gozilla,traviata”以下浏览器不开启compression4)compressableMimeType="text/html,text/xml"压缩类型最后不要忘记在8443端口添加同样的配置,因为如果我们使用https协议,就会使用8443端口的配置:====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,则2个Survivor区与1个Eden区的比例为2:4,1个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"具体的垃圾回收策略和对应策略的参数如下:Serialcollector(beforeJDK1.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)upstreamyy_001{server10.99.99.99:8080;服务器10.99.99.100:8080;散列$**;healthcheck_enabled;healthcheck_delay3000;healthcheck_timeout1000;healthcheck_failcount2;healthcheck_send'GET/healthcheck.htmlHTTP/1.0''主机:wo.com''连接:关闭';}服务器{包括base.conf;server_namewo.de.tian;...location/yy/{proxy_passhttp://yy_001;}首先dns解析wo.de.tian机器,一般是ng服务器的ip地址,然后ng根据服务器的配置搜索路径为yy/的机器列表,ip和port最后选择其中一台机器访问--->下面是详细过程1)请求发送到本地8080端口,由那里监听的CoyoteHTTP/1.1Connector获取2)Connector将请求交给所在服务引擎处理并等待引擎响应3)引擎获取请求localhost/yy/index.jsp,匹配它拥有的所有虚拟主机主机4)引擎匹配名为localhost的主机(即使它没有匹配,就会将请求交给Host处理,因为Host定义为Engine默认的host)5)localhostHost获取请求/yy/index.jsp,匹配自己拥有的所有Context6)Host匹配路径为/yy的Context(如果没有匹配,则将请求交给路径名为“”的Context处理)7)path="/yy"的Context获取请求/index.jsp,并在其映射表中找到对应的servlet8)Context匹配se与*.jsp的URLPATTERNrvlet,对应JspServlet类9)构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法10)Context执行后返回HttpServletResponse对象给Host11)Host返回HttpServletResponse对象给Engine12)EngineHttpServletResponse对象为返回给Connector13)Connector返回HttpServletResponse对象给客户端浏览器更多面试题或者学习资源可以查看我的主页或者评论