深入拆解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
登录|注册

39 | Tomcat进程占用CPU过高怎么办?

李号双 2019-08-10
在性能优化这个主题里,前面我们聊过了 Tomcat 的内存问题和网络相关的问题,接下来我们看一下 CPU 的问题。CPU 资源经常会成为系统性能的一个瓶颈,这其中的原因是多方面的,可能是内存泄露导致频繁 GC,进而引起 CPU 使用率过高;又可能是代码中的 Bug 创建了大量的线程,导致 CPU 上下文切换开销。
今天我们就来聊聊 Tomcat 进程的 CPU 使用率过高怎么办,以及怎样一步一步找到问题的根因。

“Java 进程 CPU 使用率高”的解决思路是什么?

通常我们所说的 CPU 使用率过高,这里面其实隐含着一个用来比较高与低的基准值,比如 JVM 在峰值负载下的平均 CPU 利用率为 40%,如果 CPU 使用率飙到 80% 就可以被认为是不正常的。
典型的 JVM 进程包含多个 Java 线程,其中一些在等待工作,另一些则正在执行任务。在单个 Java 程序的情况下,线程数可以非常低,而对于处理大量并发事务的互联网后台来说,线程数可能会比较高。
对于 CPU 的问题,最重要的是要找到是哪些线程在消耗 CPU,通过线程栈定位到问题代码;如果没有找到个别线程的 CPU 使用率特别高,我们要怀疑到是不是线程上下文切换导致了 CPU 使用率过高。下面我们通过一个实例来学习 CPU 问题定位的过程。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • a、
    1.使用了Java的newCachedThreadPool,因为最大线程数是int最大值
    2.自定义线程池最大线程数设置不合理
    3.线程池的拒绝策略,选择了如果队列满了并且线程达到最大线程数后,提交的任务交给提交任务线程处理

    作者回复: 赞

    2019-08-10
    5
  • 新世界
    线程池和等待队列设置不合理以及拒绝策略设置不合理会导致线程数失控,比如线程池设置小,等到队列也不大,拒绝策略选择用主线程继续执行,瞬间大量请求,会导致等到队列占满,进而用主线程执行任务,导致tomcat线程被打满,线程数失控
    2019-08-10
    2
  • 802.11
    老师这些都是一些实时的操作,但是大部分情况CPU高的时候并没有及时的在服务器上观察,一旦错过了这个发生的时间点,事后该怎样去判断和定位呢

    作者回复: 这确实是个问题。监控系统一般会将各种指标包括cpu,内存等存下来,但是打印出线程栈,heapdump这些需要手动操作

    2019-08-10
    1
  • 802.11
    TIMED_WAITING 是什么意思呢?有什么寓意呢

    作者回复: 根据TCP协议,主动发起关闭的一方,会进入TIME_WAIT状态

    2019-08-10
    1
  • 陆离
    容器在启动起来之后就被kill掉的原因有哪些?和CPU过高有关系吗

    作者回复: 如何确定是“被kill”呢,或者是异常退出?如果是被kill,看是被谁kill了

    2019-08-10
  • 许童童
    哪些情况可能导致程序中的线程数失控,产生大量线程呢?
    创建线程池时参数是计算出来的,而计算的过程是有bug的,导致结果有问题,从而创建了大量线程。
    这种需要对程序进行测试,线上持续进行性能监控,发现并解决问题。
    2019-08-10
  • a、
    1.使用了Java的newCachedThreadPool,因为最大线程数是int最大值
    2.
    2019-08-10
  • -W.LI-
    用线程池创建线程,设置合理的最大线程数。
    之前遇见过压测十几个接口200并发下cpu使用率90%可是看了大多都是4%消耗。当时确实发现全部加起来没到90%,最后也没找到原因,就不了了之了。。线上多加了太服务器
    2019-08-10
  • nimil
    👍赞
    2019-08-10
收起评论
9
返回
顶部