精华内容
下载资源
问答
  • Tomcat 面试题汇总
    万次阅读 多人点赞
    2018-08-09 15:11:05

    1、Tomcat的缺省端口是多少,怎么修改?

    1)找到Tomcat目录下的conf文件夹
    
    2)进入conf文件夹里面找到server.xml文件
    
    3)打开server.xml文件
    
    4)在server.xml文件里面找到下列信息
    
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
    port="8080"改成你想要的端口
    

    2、tomcat 有哪几种Connector 运行模式(优化)?

    bio:传统的Java I/O操作,同步且阻塞IO。
    maxThreads="150"//Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。 
    minSpareThreads="25"---Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。 
    maxSpareThreads="75"--一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数*每秒用户操作次数*系统平均操作时间” 来计算。 
    acceptCount="100"----指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。 
    connectionTimeout="20000" --网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 
    
    nio:JDK1.4开始支持,同步阻塞或同步非阻塞IO。
    指定使用NIO模型来接受HTTP请求 
    protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型来接受HTTP请求。默认是BlockingIO,配置为protocol="HTTP/1.1" 
    acceptorThreadCount="2" 使用NIO模型时接收线程的数目 
    
    aio(nio.2):JDK7开始支持,异步非阻塞IO。
    
    apr:Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地 提高Tomcat对静态文件的处理性能。
    
    
    <!--
          <Connector connectionTimeout="20000" port="8000" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
        -->
        <!-- protocol 启用 nio模式,(tomcat8默认使用的是nio)(apr模式利用系统级异步io) -->
        <!-- minProcessors最小空闲连接线程数-->
        <!-- maxProcessors最大连接线程数-->
        <!-- acceptCount允许的最大连接数,应大于等于maxProcessors-->
        <!-- enableLookups 如果为true,requst.getRemoteHost会执行DNS查找,反向解析ip对应域名或主机名-->
        <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
            connectionTimeout="20000"
            redirectPort="8443
            maxThreads=“500” 
            minSpareThreads=“100” 
            maxSpareThreads=“200”
            acceptCount="200"
            enableLookups="false"       
        />
        
    其他配置
    
    maxHttpHeaderSize="8192" http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。 
    URIEncoding="UTF-8" 指定Tomcat容器的URL编码格式。 
    disableUploadTimeout="true" 上传时是否使用超时机制 
    enableLookups="false"--是否反查域名,默认值为true。为了提高处理能力,应设置为false 
    compression="on"   打开压缩功能 
    compressionMinSize="10240" 启用压缩的输出内容大小,默认为2KB 
    noCompressionUserAgents="gozilla, traviata"   对于以下的浏览器,不启用压缩 
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩 
    

    3、Tomcat有几种部署方式?

    1)直接把Web项目放在webapps下,Tomcat会自动将其部署
    
    2)在server.xml文件上配置<Context>节点,设置相关的属性即可
    
    3)通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。
    
    编写XML的方式来进行设置。
    

    4、tomcat容器是如何创建servlet类实例?用到了什么原理?

    当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,
    
    并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。
    
    (有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,
    
    如果不写或为负数,则第一次请求实例化。
    

    5.tomcat 如何优化?

    1、优化连接配置.这里以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优化的地方都加上了。
    

    6.内存调优

    内存方式的设置是在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区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 
    

    7.垃圾回收策略调优

    垃圾回收的设置也是在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:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 
    

    7.共享session处理

    目前的处理方式有如下几种: 
    1).使用Tomcat本身的Session复制功能 
    参考http://ajita.iteye.com/blog/1715312(Session复制的配置) 
    方案的有点是配置简单,缺点是当集群数量较多时,Session复制的时间会比较长,影响响应的效率 
    2).使用第三方来存放共享Session 
    目前用的较多的是使用memcached来管理共享Session,借助于memcached-sesson-manager来进行Tomcat的Session管理 
    参考http://ajita.iteye.com/blog/1716320(使用MSM管理Tomcat集群session) 
    3).使用黏性session的策略 
    对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同一个用户的session可以由nginx或者apache交给同一个Tomcat来处理,这就是所谓的session sticky策略,目前应用也比较多 
    参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky) 
    nginx默认不包含session sticky模块,需要重新编译才行(windows下我也不知道怎么重新编译) 
    优点是处理效率高多了,缺点是强会话要求的场合不合适 
    
    

    8.添加JMS远程监控

    对于部署在局域网内其它机器上的Tomcat,可以打开JMX监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在JVM启动参数中配置即可,配置如下: 
    -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false 
    -Djava.rmi.server.hostname=192.168.71.38 设置JVM的JMS监控监听的IP地址,主要是为了防止错误的监听成127.0.0.1这个内网地址 
    -Dcom.sun.management.jmxremote.port=1090 设置JVM的JMS监控的端口 
    -Dcom.sun.management.jmxremote.ssl=false 设置JVM的JMS监控不实用SSL 
    -Dcom.sun.management.jmxremote.authenticate=false 设置JVM的JMS监控不需要认证
    

    9.专业点的分析工具有

    IBM ISA,JProfiler、probe 等,具体监控及分析方式去网上搜索即可
    

    10.关于Tomcat的session数目

    这个可以直接从Tomcat的web管理界面去查看即可 ;
    或者借助于第三方工具Lambda Probe来查看,它相对于Tomcat自带的管理稍微多了点功能,但也不多 ;
    

    11.监视Tomcat的内存使用情况

    使用JDK自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等;
    JDK自带的jvisualvm可以下载插件(如GC等),可以查看更丰富的信息。如果是分析本地的Tomcat的话,还可以进行内存抽样等,检查每个类的使用情况
    

    12.打印类的加载情况及对象的回收情况

    这个可以通过配置JVM的启动参数,打印这些信息(到屏幕(默认也会到catalina.log中)或者文件),具体参数如下: 
    -XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] 
    -XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] 
    -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] 
    -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds 
    -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds 
    -XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息 
    -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析 
    -verbose:class 监视加载的类的情况 
    -verbose:gc 在虚拟机发生内存回收时在输出设备显示信息 
    -verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息 
    

    13.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
    

    Tomcat工作模式?

    笔者回答:Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。
    
    进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
    
    Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
    
    Tomcat作为独立服务器:请求来自于web浏览器;
    
    更多相关内容
  • servlet+tomcat面试题及答案解析
  • servlet+tomcat面试题及答案解析
  • tomcat 有哪几种 Connector 运行模式(优化)? bio:传统的 Java I/O 操作,同步且阻塞 IO。 maxThreads=”150”//Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大的线程数。默认值 200。可以...
  • Tomcat常见面试题

    2021-06-07 20:27:41
    1、tomcat有哪些组件? 2、tomcat有哪些Connector? http ajp 3、tomcat的Valve的作用是什么? 给每一个虚拟主机定义访问日志 4、servlet的生命周期? Servlet 生命周期可被定义为从创建直到毁灭的整个过程...

    1、tomcat有哪些组件?

    在这里插入图片描述

    2、tomcat有哪些Connector?

    http ajp

    3、tomcat的Valve的作用是什么?

    给每一个虚拟主机定义访问日志

    4、servlet的生命周期?

    Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
    Servlet 通过调用 init () 方法进行初始化。
    Servlet 调用 service() 方法来处理客户端的请求。
    Servlet 通过调用 destroy() 方法终止(结束)。
    最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

    5、tomcat有哪几种Connector运行模式?

    Tomcat Connector有三种运行模式(BIO, NIO, APR)
    • BIO:
    一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。
    • NIO:
    利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动:
    • APR:
    即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。

    6、你平时怎么给tomcat调优?

    第一步 – 提高JVM栈内存Increase JVM heap memory
    第二步 – 线程池设置
    maxThreads=“250”
    enableLookups=“false”
    connectionTimeout=“20000”
    第三步- 压缩
    compression=“on”


    展开全文
  • 想成为Java架构师,这些都是不可避免也是必须要掌握的哦,对于其他模块的面试题,我后续也将单独分享面试问题和答案。成为Java架构师的这条路道阻且艰,但是既然选择了远方就是选择了风雨兼程,希望大家都能早日圆...

    Java架构师面试网】收集整理了一些Java面试的常见问题,这些问题可能会在你下一次技术面试中遇到。想成为Java架构师,这些都是不可避免也是必须要掌握的哦,对于其他模块的面试题,我后续也将单独分享面试问题和答案。成为Java架构师的这条路道阻且艰,但是既然选择了远方就是选择了风雨兼程,希望大家都能早日圆自己的架构师梦,同样也希望我自己可以,除了网站,还做了个公众号:Java架构师面试网,关注并加交流群即可获得我给你准备的精美面试礼包哦~

    1、Tomcat 的缺省端口是多少,怎么修改? 1)找到 Tomcat 目录下的 conf 文件夹 2)进入 conf 文件夹里面找到 server.xml 文件 3)打开 server.xml 文件 4)在 server.xml 文件里面找到下列信息

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>

    port="8080"改成你想要的端口

    2、tomcat 有哪几种 Connector 运行模式(优化)? bio:传统的 Java I/O 操作,同步且阻塞 IO。 maxThreads=”150”//Tomcat 使用线程来处理接收的每个请求。这个值表示Tomcat 可创建的最大的线程数。默认值 200。可以根据机器的时期性能和内存大小调整,一般可以在 400-500。最大可以在 800 左右。 minSpareThreads=”25”—Tomcat 初始化时创建的线程数。默认值 4。如果当前没有空闲线程,且没有超过 maxThreads,一次性创建的空闲线程数量。 Tomcat 初始化时创建的线程数量也由此值设置。maxSpareThreads=”75”–一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。默认值 50。一旦创建的线程超过此数值,Tomcat 会关闭不再需要的线程。线程数可以大致上用 “同时在线人数每秒用户操作次数系统平均操作时间” 来计算。 acceptCount=”100”—-指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为 0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。 connectionTimeout=”20000” –网络连接超时,默认值 20000,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。 nio:JDK1.4 开始支持,同步阻塞或同步非阻塞 IO。 指定使用 NIO 模型来接受 HTTP 请求 protocol=”org.apache.coyote.http11.Http11NioProtocol” 指定使用 NIO 模型来接受 HTTP 请求。默认是 BlockingIO,配置为 protocol=”HTTP/1.1” acceptorThreadCount=”2” 使用 NIO 模型时接收线程的数目aio(nio.2):JDK7 开始支持,异步非阻塞 IO。 apr:Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地 提高 Tomcat 对静态文件的处理性能。

    <!--
     <Connector connectionTimeout="20000" port="8000"
    protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
     -->
     <!-- protocol 启用 nio 模式,(tomcat8 默认使用的是 nio)(apr 模式利用系统级异步 io) -->
     <!-- minProcessors 最小空闲连接线程数-->
     <!-- maxProcessors 最大连接线程数-->
     <!-- acceptCount 允许的最大连接数,应大于等于 maxProcessors-->
     <!-- enableLookups 如果为 true,requst.getRemoteHost 会执行 DNS 查找,反向解析 ip 对应域名或主机名-->
     <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443 maxThreads=“500” minSpareThreads=“100” maxSpareThreads=“200” acceptCount="200" enableLookups="false"/>

    其他配置 maxHttpHeaderSize="8192" http 请求头信息的最大程度,超过此长度的部分不予处理。一般 8K。 URIEncoding="UTF-8" 指定 Tomcat 容器的 URL 编码格式。disableUploadTimeout="true" 上传时是否使用超时机制enableLookups="false"--是否反查域名,默认值为 true。为了提高处理能力,应设置为 false compression="on" 打开压缩功能compressionMinSize="10240" 启用压缩的输出内容大小,默认为 2KB noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

    3、Tomcat 有几种部署方式? 1)直接把 Web 项目放在 webapps 下,Tomcat 会自动将其部署 2)在 server.xml 文件上配置 节点,设置相关的属性即可 3)通过 Catalina 来进行配置:进入到 conf\Catalina\localhost 文件下,创建一个xml 文件,该文件的名字就是站点的名字。编写 XML 的方式来进行设置。

    4、tomcat 容器是如何创建 servlet 类实例?用到了什么原理? 当容器启动时,会读取在 webapps 目录下所有的 web 应用中的 web.xml 文件,然后对 xml 文件进行解析,并读取 servlet 注册信息。然后,将每个应用中注册的 servlet 类都进行加载,并通过反射的方式实例化。 (有时候也是在第一次请求时实例化)在 servlet 注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

    5.tomcat 如何优化? 1、优化连接配置.这里以 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 优化的地方都加上了。

    6.内存调优 内存方式的设置是在 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 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

    7.垃圾回收策略调优 垃圾回收的设置也是在 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:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

    8.共享 session 处理 目前的处理方式有如下几种: 1).使用 Tomcat 本身的 Session 复制功能 参考 http://ajita.iteye.com/blog/1715312(Session 复制的配置)方案的有点是配置简单,缺点是当集群数量较多时,Session 复制的时间会比 较长,影响响应的效率 2).使用第三方来存放共享 Session 目前用的较多的是使用 memcached 来管理共享 Session,借助于memcached-sesson-manager 来进行 Tomcat 的 Session 管理参考 http://ajita.iteye.com/blog/1716320(使用 MSM 管理 Tomcat 集群session) 3).使用黏性 session 的策略 对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同一个用户的 session 可以由 nginx 或者 apache 交给同一个 Tomcat 来处理,这就是所谓的 session sticky 策略,目前应用也比较多 参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky)nginx 默认不包含 session sticky 模块,需要重新编译才行 优点是处理效率高多了,缺点是强会话要求的场合不合适

    8.添加 JMS 远程监控 对于部署在局域网内其它机器上的 Tomcat,可以打开 JMX 监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在 JVM 启动参数中配置即可,配置如下: -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.71.38 设置 JVM 的 JMS 监控监听的 IP地址,主要是为了防止错误的监听成 127.0.0.1 这个内网地址 -Dcom.sun.management.jmxremote.port=1090 设置 JVM 的 JMS 监控的端口 -Dcom.sun.management.jmxremote.ssl=false 设置 JVM 的 JMS 监控不实用SSL -Dcom.sun.management.jmxremote.authenticate=false 设置 JVM 的 JMS 监控不需要认证

    9.专业点的分析工具有 IBM ISA,JProfiler、probe 等,具体监控及分析方式去网上搜索即可

    10.关于 Tomcat 的 session 数目 这个可以直接从 Tomcat 的 web 管理界面去查看即可 ; 或者借助于第三方工具 Lambda Probe 来查看,它相对于 Tomcat 自带的管理稍微多了点功能,但也不多 ;

    11.监视 Tomcat 的内存使用情况 使用 JDK 自带的 jconsole 可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等; JDK 自带的 jvisualvm 可以下载插件(如 GC 等),可以查看更丰富的信息。 如果是分析本地的 Tomcat 的话,还可以进行内存抽样等,检查每个类的使用情况

    12.打印类的加载情况及对象的回收情况 这个可以通过配置 JVM 的启动参数,打印这些信息(到屏幕(默认也会到 catalina.log 中)或者文件),具体参数如下: -XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] -XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K),0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K),0.0436268 secs] -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可与上面两个混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960secs] -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524seconds -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds -XX:PrintHeapAtGC: 打印 GC 前后的详细堆栈信息 -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析 -verbose:class 监视加载的类的情况 -verbose:gc 在虚拟机发生内存回收时在输出设备显示信息 -verbose:jni 输出 native 方法调用的相关情况,一般用于诊断 jni 调用错误信息

    13.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.1Connector 获得 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

    14.Tomcat 工作模式? Tomcat 是一个 JSP/Servlet 容器。其作为 Servlet 容器,有三种工作模式:独立的 Servlet 容器、进程内的 Servlet 容器和进程外的 Servlet 容器。 进入 Tomcat 的请求可以根据 Tomcat 的工作模式分为如下两类: Tomcat 作为应用程序服务器:请求来自于前端的 web 服务器,这可能是Apache, IIS, Nginx 等; Tomcat 作为独立服务器:请求来自于 web 浏览器;

    15.你怎样给 tomcat 去调优?

    1. JVM 参数调优:-Xms 表示 JVM 初始化堆的大小,-Xmx 表示 JVM 堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的 80%。在 catalina.bat 中,设置 JAVA_OPTS='-Xms256m -Xmx512m',表示初始化内存为 256MB,可以使用的最大内存为 512MB。

    2. 禁用 DNS 查询 当 web 应用程序向要记录客户端的信息时,它也会记录客户端的 IP 地址或者通过域名服务器查找机器名转换为 IP 地址。DNS 查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的 IP 的过程,这样会消耗一定的时间。为了消除 DNS 查询对性能的影响我们可以关闭 DNS 查询,方式是修改 server.xml 文件中的 enableLookups 参数值:

      Tomcat4 Tomcat5

    3. 调整线程数 通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat 使用线程池加速响应速度来处理请求。在 Java 中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出 CPU 最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。 Tomcat4 中可以通过修改 minProcessors 和 maxProcessors 的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。 minProcessors 服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生 5 次单击事件,并且每个请求任务处理需要 1 秒钟,那么预先设置线程数为 5 就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors 的值。maxProcessors 的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server 允许的最大连接数还受制于操作系统的内核参数设置,通常Windows 是 2000 个左右,Linux 是 1000 个左右。 在 Tomcat5 对这些参数进行了调整,请看下面属性:maxThreads Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大的线程数。 acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。 connnectionTimeout 网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。 minSpareThreads Tomcat 初始化时创建的线程数。 maxSpareThreads 一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。 最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的 web 站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。

    16.如何加大 tomcat 连接数 在 tomcat 配置文件 server.xml 中的 配置中,和连接数相关的参数有: minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10 maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75 acceptCount:允许的最大连接数,应大于等于 maxProcessors,默认值为 100 enableLookups:是否反查域名,取值为:true 或 false。为了提高处理能力,应设置为 false connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。 其中和最大连接数相关的参数为 maxProcessors 和 acceptCount。如果要加大并发连接数,应同时加大这两个参数。 web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右,Linux 是 1000 个左右。tomcat5 中的配置示例:

    <Connector port="8080"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    debug="0" connectionTimeout="20000"
    disableUploadTimeout="true" />
    对于其他端口的侦听配置,以此类推。
    3. tomcat 中如何禁止列目录下的文件
    在{tomcat_home}/conf/web.xml 中,把 listings 参数设置成 false 即可,如下:
    <init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
    </init-param>
    <init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
    </init-param>

    17.怎样加大 tomcat 的内存。 首先检查程序有没有限入死循环 这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的。第一次出现这样的的问题以后,引发了其他的问题。在网上一查可能是 JAVA 的堆栈设置太小的原因。 跟据网上的答案大致有这两种解决方法: 1、设置环境变量 解决方法:手动设置 Heap size 修改 TOMCAT_HOME/bin/catalina.sh set JAVA_OPTS= -Xms32m -Xmx512m 可以根据自己机器的内存进行更改。 2、java -Xms32m -Xmx800m className 就是在执行 JAVA 类文件时加上这个参数,其中 className 是需要执行的确类名。(包括包名) 这个解决问题了。而且执行的速度比没有设置的时候快很多。 如果在测试的时候可能会用 Eclispe 这时候就需要在 Eclipse ->run -arguments 中的 VM arguments 中输入-Xms32m -Xmx800m 这个参数就可以了。 后来在 Eclilpse 中修改了启动参数,在 VM arguments 加入了-Xms32m -Xmx800m,问题解决。 一、java.lang.OutOfMemoryError: PermGen space PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域,这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 时就会被放到 PermGen space 中,它和存放类实例(Instance)的 Heap 区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space 进行清理,所以如果你的应用中有很多 CLASS 的话,就很可能出现 PermGen space 错误,这种错误常见在 web 服务器对 JSP 进行 pre compile 的时候。如果你的 WEB APP 下都用了大量的第三方 jar, 其大小超过了 jvm 默认的大小(4M)那么就会产生此错误信息了。 解决方法: 手动设置 MaxPermSize 大小 修改 TOMCAT_HOME/bin/catalina.sh在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

    JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m

    建议:将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这样可以达到减少 jar 文档重复占用内存的目的。 二、java.lang.OutOfMemoryError: Java heap spaceHeap size 设置 JVM 堆的设置是指 java 程序运行过程中 JVM 可以调配使用的内存空间的设置.JVM 在启动的时候会自动设置 Heap size 的值, 其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的-Xmn -Xms -Xmx 等选项可进行设置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。 提示:在 JVM 中如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的 80%,一般的要将-Xms 和-Xmx 选项设置为相同,而Xmn 为 1/4 的-Xmx 值。 解决方法:手动设置 Heap size 修改 TOMCAT_HOME/bin/catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

    三、实例,以下给出 1G 内存环境下 java jvm 的参数设置参考: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m - XX:MaxPermSize=128m -Djava.awt.headless=true " 很大的 web 工程,用 tomcat 默认分配的内存空间无法启动,如果不是在 myeclipse 中启动 tomcat 可以对 tomcat 这样设置: TOMCAT_HOME/bin/catalina.bat 中添加这样一句话: set JAVA_OPTS=-server -Xms2048m -Xmx4096m -XX:PermSize=512M - XX:MaxPermSize=1024M -Duser.timezone=GMT+08 或者 set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m 如果要在 myeclipse 中启动,上述的修改就不起作用了,可如下设置: Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m 以上是转贴,但本人遇见的问题是:在 myeclipse 中启动 Tomcat 时,提示"ava.lang.OutOfMemoryError: Java heap space",解决办法就是: Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m

    18.Tomcat 有几种部署方式 tomcat 中四种部署项目的方法 第一种方法: 在 tomcat 中的 conf 目录中,在 server.xml 中的, 节点中添加:

    <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>

    第 3 个方法有个优点,可以定义别名。服务器端运行的项目名称为 path,外部访问的 URL 则使用 XML 的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。第 2、3 还有优点,可以定义一些个性配置,如数据源的配置等。 第四种办法,: 可以用 tomcat 在线后台管理器,一般 tomcat 都打开了,直接上传 war 就可以

    19.Tomcat 的优化经验。 Tomcat 作为 Web 服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:  去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存。  服务器资源 服务器所能提供 CPU、内存、硬盘的性能对处理能力有决定性影响。 o 对于高并发情况下会有大量的运算,那么 CPU 的速度会直接影响到处理速度。 o 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用 -Xmx -Xms -XX:MaxPermSize 等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于 full GC,从而导致处理能力严重下降。 o 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。  利用缓存和压缩对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了 Nginx 作为缓存服务器,将图片、css、js 文件都进行了缓存,有效的减少了后端 tomcat 的访问。 另外,为了能加快网络传输速度,开启gzip 压缩也是必不可少的。但考虑到 tomcat 已经需要处理很多东西了,所以把这个压缩的工作就交给前端的 Nginx 来完成。 除了文本可以用gzip 压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从 300多 kb 压缩到几十 kb,自己几乎看不出来区别。  采用集群 单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat 集群是有效提升性能的手段。我们还是采用了 Nginx 来作为请求分 流的服务器,后端多个 tomcat 共享 session 来协同工作。可以参考之前写的《利用 nginx+tomcat+memcached 组建 web 服务器负载均衡》。  优化 tomcat 参数 这里以 tomcat7 的参数配置为例,需要修改 conf/server.xml 文件,主要是优化连接配置,关闭客户端 dns 查询。

    <Connector port="8080"
     protocol="org.apache.coyote.http11.Http11NioProtocol"
     connectionTimeout="20000"
     redirectPort="8443"
     maxThreads="500"
     minSpareThreads="20"
     acceptCount="100"
     disableUploadTimeout="true"
     enableLookups="false"
     URIEncoding="UTF-8" />

    嗨,你好呀,未来的架构师,本文由Java架构师面试网www.javajiagoushi.com收集整理并进行编辑发布,谢谢大家的支持~

    展开全文
  • 架构师面试题系列之Tomcat面试专题及答案
  • Tomcat面试题(2020最新版)

    千次阅读 多人点赞 2020-11-03 15:04:22
    Tomcat是什么? Tomcat的缺省端口是多少,怎么修改 tomcat 有哪几种Connector 运行模式(优化)? Tomcat有几种部署方式? tomcat容器是如何创建servlet类实例?用到了什么原理? Tomcat工作模式 Tomcat...

    文章目录

     

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    Tomcat是什么?

    Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

    Tomcat的缺省端口是多少,怎么修改

    1. 找到Tomcat目录下的conf文件夹
    2. 进入conf文件夹里面找到server.xml文件
    3. 打开server.xml文件
    4. 在server.xml文件里面找到下列信息
    5. 把Connector标签的8080端口改成你想要的端口
    <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" />
    
    • 1
    • 2
    • 3
    • 4

    tomcat 有哪几种Connector 运行模式(优化)?

    下面,我们先大致了解Tomcat Connector的三种运行模式。

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

    ​ 配制项:protocol=”HTTP/1.1”

    • NIO:同步非阻塞IO

      利用Java的异步IO处理,可以通过少量的线程处理大量的请求,可以复用同一个线程处理多个connection(多路复用)。

      Tomcat8在Linux系统中默认使用这种方式。

      Tomcat7必须修改Connector配置来启动。

      配制项:protocol=”org.apache.coyote.http11.Http11NioProtocol”

      备注:我们常用的Jetty,Mina,ZooKeeper等都是基于java nio实现.

    • APR:即Apache Portable Runtime,从操作系统层面解决io阻塞问题。**AIO方式,**异步非阻塞IO(Java NIO2又叫AIO) 主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。

      配制项:protocol=”org.apache.coyote.http11.Http11AprProtocol”

      备注:需在本地服务器安装APR库。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。

    Tomcat有几种部署方式?

    在Tomcat中部署Web应用的方式主要有如下几种:

    1. 利用Tomcat的自动部署。

      把web应用拷贝到webapps目录。Tomcat在启动时会加载目录下的应用,并将编译后的结果放入work目录下。

    2. 使用Manager App控制台部署。

      在tomcat主页点击“Manager App” 进入应用管理控制台,可以指定一个web应用的路径或war文件。

    3. 修改conf/server.xml文件部署。

      修改conf/server.xml文件,增加Context节点可以部署应用。

    4. 增加自定义的Web部署文件。

      在conf/Catalina/localhost/ 路径下增加 xyz.xml文件,内容是Context节点,可以部署应用。

    tomcat容器是如何创建servlet类实例?用到了什么原理?

    1. 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)
    2. 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

    Tomcat工作模式

    Tomcat作为servlet容器,有三种工作模式:

    • 1、独立的servlet容器,servlet容器是web服务器的一部分;
    • 2、进程内的servlet容器,servlet容器是作为web服务器的插件和java容器的实现,web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足;
    • 3、进程外的servlet容器,servlet容器运行于web服务器之外的地址空间,并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优;

    进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:

    • Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
    • Tomcat作为独立服务器:请求来自于web浏览器;

    面试时问到Tomcat相关问题的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握,下面这一篇文章整理了Tomcat相关的系统架构,介绍了Server、Service、Connector、Container之间的关系,各个模块的功能,可以说把这几个掌握住了,Tomcat相关的面试题你就不会有任何问题了!另外,在面试的时候你还要有意识无意识的往Tomcat这个地方引,就比如说常见的Spring MVC的执行流程,一个URL的完整调用链路,这些相关的题目你是可以往Tomcat处理请求的这个过程去说的!掌握了Tomcat这些技能,面试官一定会佩服你的!

    学了本章之后你应该明白的是:

    • Server、Service、Connector、Container四大组件之间的关系和联系,以及他们的主要功能点;
    • Tomcat执行的整体架构,请求是如何被一步步处理的;
    • Engine、Host、Context、Wrapper相关的概念关系;
    • Container是如何处理请求的;
    • Tomcat用到的相关设计模式;

    Tomcat顶层架构

    俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat 最核心的模块,问题才可以游刃而解,了解了 Tomcat 的整体架构对以后深入了解 Tomcat 来说至关重要!

    先上一张Tomcat的顶层结构图(图A),如下:

    在这里插入图片描述

    Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,即可以包含多个Service,用于具体提供服务。

    Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:

    • Connector用于处理连接相关的事情,并提供Socket与Request请求和Response响应相关的转化;
    • Container用于封装和管理Servlet,以及具体处理Request请求;

    一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接,示意图如下(Engine、Host、Context下面会说到):

    在这里插入图片描述

    多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由 Server 控制。

    另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0)

    在这里插入图片描述

    详细的配置文件内容可以到Tomcat官网查看:Tomcat配置文件

    上边的配置文件,还可以通过下边的一张结构图更清楚的理解:

    在这里插入图片描述

    Server标签设置的端口号为8005,shutdown=”SHUTDOWN” ,表示在8005端口监听“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。一个Server有一个Service,当然还可以进行配置,一个Service有多个Connector,Service左边的内容都属于Container的,Service下边是Connector。

    Tomcat顶层架构小结

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

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

    3. Service 是对外提供服务的;

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

    5. Container用于封装和管理Servlet,以及具体处理request请求;

    知道了整个Tomcat顶层的分层架构和各个组件之间的关系以及作用,对于绝大多数的开发人员来说Server和Service对我们来说确实很远,而我们开发中绝大部分进行配置的内容是属于Connector和Container的,所以接下来介绍一下Connector和Container。

    Connector和Container的微妙关系

    由上述内容我们大致可以知道一个请求发送到Tomcat之后,首先经过Service然后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

    Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

    Tomcat既然需要处理请求,那么肯定需要先接收到这个请求,接收请求这个东西我们首先就需要看一下Connector!

    Connector架构分析

    Connector用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

    因此,我们可以把Connector分为四个方面进行理解:

    1. Connector如何接受请求的?

    2. 如何将请求封装成Request和Response的?

    3. 封装完之后的Request和Response如何交给Container进行处理的?

    4. Container处理完之后如何交给Connector并返回给客户端的?

    首先看一下Connector的结构图(图B),如下所示:

    在这里插入图片描述

    Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。

    其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。

    1. Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。

    2. Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。

    3. Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

    至此,我们应该很轻松的回答1,2,3的问题了,但是4还是不知道,那么我们就来看一下Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector的?

    Container架构分析

    Container用于封装和管理Servlet,以及具体处理Request请求,在Container内部包含了4个子容器,结构图如下(图C):

    在这里插入图片描述

    4个子容器的作用分别是:

    1. Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;

    2. Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;

    3. Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;

    4. Wrapper:每一Wrapper封装着一个Servlet;

    下面找一个Tomcat的文件目录对照一下,如下图所示:

    在这里插入图片描述

    Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点。

    我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.baidu.com,如果是Host(webapps)下的其他应用,则可以使用www.baidu.com/docs进行访问,当然默认指定的根应用(ROOT)是可以进行设定的,只不过Host站点下默认的主应用是ROOT目录下的。

    看到这里我们知道Container是什么,但是还是不知道Container是如何进行请求处理的以及处理完之后是如何将处理完的结果返回给Connector的?别急!下边就开始探讨一下Container是如何进行处理的!

    Container如何处理请求的

    Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)

    Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的结果返回,再让下一个处理者继续处理。

    在这里插入图片描述

    但是!Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:

    • 每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;

    • 在上层容器的管道的BaseValve中会调用下层容器的管道。

    我们知道Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

    Pipeline的处理流程图如下(图D):

    在这里插入图片描述

    • Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);

    • 在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。

    • 当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

    • 当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

    总结

    至此,我们已经对Tomcat的整体架构有了大致的了解,从图A、B、C、D可以看出来每一个组件的基本要素和作用。我们在脑海里应该有一个大概的轮廓了!如果你面试的时候,让你简单的聊一下Tomcat,上面的内容你能脱口而出吗?当你能够脱口而出的时候,面试官一定会对你刮目相看的!

    展开全文
  • 1、Tomcat 的缺省端口是多少,怎么修改? 1)找到 Tomcat 目录下的 conf 文件夹 2)进入 conf 文件夹里面找到 server.xml 文件 3)打开 server.xml 文件 4)在 server.xml 文件里面找到下列信息 <Connector ...
  • 史上最全Java初中级面试题,发现网上很多Java初级面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有...
  • 2021刚开始,很多朋友问题,有没有一些Java基础面试题及答案面试题,最近抽时间整理了一份Java面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 最新Java 面试了,...
  • Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。 Java中级面试永远是程序员...
  • 即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了6道关于tomcat的核心面试题以及参看答案,看完对于绝大多数人应对面试妥妥的。1、Tomcat的缺省端...
  • 发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全~ 这套互联网 Java 工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux...
  • 最近梳理2021最新 Spring 面试题 全家桶【附答案解析】,包含了 Java基础、Spring、SpringMVC、Redis、SpringCloud、设计模式、等多个类型。 今天这篇是关于 Spring 全家桶面试题,总结了 110 道经典问题。 这套...
  • 目录 前言 1、Tomcat的缺省端口是多少,怎么修改? 2、tomcat 有哪几种Connector 运行模式(优化)? 3、Tomcat有几种部署方式?...4、tomcat容器是如何创建servlet...12.打印类的加载情况对象的回收情况 13.Tomcat
  • JVM面试题及答案整理(最新版)

    千次阅读 2021-08-05 08:28:41
    Jvm面试题及答案整理965道(2021最新版) 这是我收集的《Jvm 最常见的 965道面试题》高级Java面试问题列表。这些问题主要来自 JVM核心部分 ,你可能知道这些棘手的JVM 问题的答案,或者觉得这些不足以挑战你的 Java ...
  • 另外如果大家觉得我找的SpringBoot面试题答案不够清晰,欢迎私信或者评论只出,我看到都会去修改的! 1、SpringBoot有哪些优点? SpringBoot的优点有: 1、减少开发,测试时间和努力。 2、使用JavaConfig有助...
  • 最新Jvm面试题答案【附答案解析】Jvm面试题大全带答案,Jvm面试题最新面试题,Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些Jvm面试题答案是在网上搜集整理的。这些答案难免会存在一些错误,仅...
  • Java面试题答案(2021年Java面试题大全带答案) Java面试题答案【最新版】Java高级面试题大全(2021版),发现网上很多Java面试题答案...Java中级面试题答案大全(2021年Java面试题答案大汇总) 01、为什么使用E
  • 最新SpringCloud面试题及答案【附答案解析】SpringCloud面试题及答案,SpringCloud最新面试题及答案,SpringCloud面试题答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免...
  • Java面试题及答案整理1500道(2021最新版) 这是我收集的《Java 最常见的 1500道面试题》高级Java面试问题列表。这些问题主要来自 Java 核心部分 ,你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你...
  • 以下是一些比较常见的Tomcat面试题:JAVA高级架构​​​​​​​ 1,Tomcat的的缺省端口是多少,怎么修改? 2,tomcat有哪几种连接器运行模式(优化)? 3,Tomcat的有几种部署方式? 4,tomcat的容器是如何创建...
  • 最新Jvm面试题及答案【附答案解析】Jvm面试题及答案2021,Jvm面试题最新面试题,Jvm面试题答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考...
  • 2021最新Java面试题【附答案解析】java面试题及答案2021,java2021最新面试题及答案汇总,2021最Java面试题答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的java面试题及答案汇总。...
  • 答案怎么获取 关注公众号:搜云库技术团队,回复:面试题 原创整理:《第2版:互联网大厂面试题》 第2版:题库非常全面 包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper...
  • 小编特意整理了100道软件测试面试题,送给大家,希望大家都能顺利通过面试,拿下高薪。赶紧拿去吧~~ 正文: Q1、什么是软件测试? Q2、软件测试的目的? Q3、测试工程师的职责 Q4、什么是软件的生命周期? ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,606
精华内容 5,042
关键字:

tomcat面试题及答案

友情链接: FIFO.rar