深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

12 | 实战:优化并提高Tomcat启动速度

李号双 2019-06-06
到目前为止,我们学习了 Tomcat 和 Jetty 的整体架构,还知道了 Tomcat 是如何启动起来的,今天我们来聊一个比较轻松的话题:如何优化并提高 Tomcat 的启动速度。
我们在使用 Tomcat 时可能会碰到启动比较慢的问题,比如我们的系统发布新版本上线时,可能需要重启服务,这个时候我们希望 Tomcat 能快速启动起来提供服务。其实关于如何让 Tomcat 启动变快,官方网站有专门的文章来介绍这个话题。下面我也针对 Tomcat 8.5 和 9.0 版本,给出几条非常明确的建议,可以现学现用。

清理你的 Tomcat

1. 清理不必要的 Web 应用
首先我们要做的是删除掉 webapps 文件夹下不需要的工程,一般是 host-manager、example、doc 等这些默认的工程,可能还有以前添加的但现在用不着的工程,最好把这些全都删除掉。如果你看过 Tomcat 的启动日志,可以发现每次启动 Tomcat,都会重新布署这些工程。
2. 清理 XML 配置文件
我们知道 Tomcat 在启动的时候会解析所有的 XML 配置文件,但 XML 解析的代价可不小,因此我们要尽量保持配置文件的简洁,需要解析的东西越少,速度自然就会越快。
3. 清理 JAR 文件
我们还可以删除所有不需要的 JAR 文件。JVM 的类加载器在加载类时,需要查找每一个 JAR 文件,去找到所需要的类。如果删除了不需要的 JAR 文件,查找的速度就会快一些。这里请注意:Web 应用中的 lib 目录下不应该出现 Servlet API 或者 Tomcat 自身的 JAR,这些 JAR 由 Tomcat 负责提供。如果你是使用 Maven 来构建你的应用,对 Servlet API 的依赖应该指定为<scope>provided</scope>
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • 西兹兹
    调大vm xms xmx避免反复扩容堆内存
    换上固态硬盘可以提速xml文件读取
    server.xml去掉监听
    去掉不要的ajp
    去掉多余的连接器
    线程池的核心线程设置延迟初始化
    去掉access log,因为nginx里已有access log
    减少项目里多余的jar
    精确设置mvc注解的包扫描范围
    xml spring bean设置延迟初始化
    数据库连接池初始化数量减少

    作者回复: 👍

    2019-06-09
    12
  • 刘冬
    请问老师,对于SpringBoot内嵌的Tomcat,怎么来优化呢?

    作者回复: 在Springboot里配置文章里提到的那些参数,比如:
    server.tomcat.additional-tld-skip-patterns: xxx*.jar

    或者通过TomcatServletWebServerFactory来修改参数
      @Bean
      public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
          @Override
          protected void postProcessContext(Context context) {
            ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
          }
        };
      }

    2019-06-06
    12
  • code-artist
    老师,这种tomcat启动优化很少用到吧。貌似很多人都不太关心tomcat启动优化

    作者回复: 重启和部署服务的时候,启动快的话能减少downtime。

    2019-06-08
    1
  • 朱晋君
    startStopThreads 的值表示你想用多少个线程来启动你的 Web 应用,如果设成 0 表示你要并行启动 Web 应用,像下面这样的配置。
    startStopThreads=0默认会用多少个线程呢?是会用系统所有能调度的线程吗?

    作者回复: Server 有一个专门的线程池来叫做utilityExecutor,来跑这些任务,在这个线程池创建startStopThreads个数的线程。默认是2个。

    2019-06-06
    1
  • Vainycos
    老师您好,在提高tomcat启动效率的方法中,您提到可以删除不必要的默认应用:host-manager/examples/docs。但是默认的应用了还有ROOT以及manager,请问这两个应用是不能随便删的是吗,分别有他各自的作用还是会影响到部署的应用,请教一下老师。
    2019-09-01
  • xj_zh
    老师,可以把每一讲的资料单独整理成一片文章呢吗,这样方便快速查找。
    比如:
    tomcat的源码连接,推荐阅读的一些资料。谢谢!
    2019-07-23
  • vvsuperman
    压测的时8c8g,做的mock请求(空请求,立即返回),并发500 tomcat 8 tps才600,如何提高tps呢?

    作者回复: 空请求没有IO等待,可以试试把线程池的线程数调小一点,减少线程切换开销,看有没有帮助

    2019-06-17
  • 新世界
    关于session ID的生成,tomcat为什么不默认指定采用非阻塞模式生成?
    2019-06-14
  • Visual C++
    有没有更大优化空间?
    2019-06-12
  • Visual C++
    我的环境是docker centos tomcat8,按你设置,还要20妙启动
    2019-06-12
  • 为什么要删除logs下不需要的日志文件

    作者回复: 文件越大,占磁盘空间

    2019-06-12
  • 小呆娃
    老师,请教您一个问题,tomcat启动的时候卡在loadClass,这个一般是什么问题呢?能给个排查的思路吗?谢谢老师

    作者回复: 用jstack看堆栈信息看具体卡在哪一行。

    2019-06-09
  • QQ怪
    学到了
    2019-06-06
收起评论
13
返回
顶部