Tomcat原理与优化随笔

1. 基础组件:

     Server,

     Service:

        Connector(http, https, ajp用于Apache反向代理), Engine

        Engine:

              Realm用于安全配置等,如UserDatabaseRealm

 

              Host:Valve链,比如自带的AccessLogValve可以记录访问日志

 

     DefaultServlet统一处理静态资源:

            流程:doGet方法判断资源文件是否存在,文件是否可读,根据文件类型设置content-type,文件时间等写入输出流

     JspServlet处理JSP请求:url-pattern = *.jsp或*.jspx

             jsp编译过程:JspServlet判断JSP文件的Servelt是否生成/过期(如class文件修改时间和jsp文件修改时间不同, tomcat会创建一个新的classLoader加载相同jsp),

            通过Compiler生成Servlet文件,调用该Servelt的_jspService方法,如果tomcat关闭了dev模式,则动态加载失效

    HttpServletRequest:用到了门面模式

           getParameter方法,判断参数是否解析过,如没有,则解析出参数键值对来,解析出的参数放到Map<String,List>结构中,这样每次

           调用getParameter方法时,返回key的第一个value

    Filter, FilterChain: 每个Filter完成后,调用FilterChain的doFilter方法调用下一个Filter

    Connector: 根据配置的protocol不同使用不同的ProtocolHandler,请求完全由Handler处理,比如 Http11NioProtocol

                      Connector会将文件超过48k直接sendfile(channel.transferTo) 发送,而不会压缩,减少了CPU占用

    Handler内部使用Endpoint进行请求接收处理

    Executor:Connector可以配置使用的线程池

 

    跨域请求:response.setHeader("Access-Control-Allow-Origin","*");  CorsFilter

    Tomcat GC优化:根据应用的延迟和吞吐量特性选择合适的gc算法

                ParallelGC吞吐量优先,不能满足低延迟需求

                CMS:老年代回收与应用程序并行,实现低延迟(需要配置-XX:+UseParNewGC实现新生代并行回收,默认单线程),单核服务器需要配置好

                应用线程和CMS收集线程所占cpu比例(交替运行垃圾收集器应用线程)。

               -XX:+UseCMSCompactAtFullCollection 在Full GC的时候对年老代的压缩

               -XX:+UseG1GC

               -XX:+DisableExplicitGC: 不建议打开,Java NIO 堆外内存代码中有显式调用System.gc 

    ELParser: 解析EL表达式

    类加载: 

          Webapp类加载器:先自己加载,在自己的类路径上找不到才会再委托parent(基础类不允许其重新加载,以及servlet-api也不允许重新加载)

                         不同的应用使用不同的WebappClassloader实例

                         如果是双亲委派没法实现多个web app隔离

                         应用启动的时候,会为其创建对应的WebappClassLoader

         Common 类加载器:WebappClassloader的parent,所有应用共同可见的class

posted @ 2019-10-30 17:17  _fred  阅读(219)  评论(0编辑  收藏  举报