作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从使用某些数据库使用 Java 开发的典型 MVC/Web 应用程序的角度来看:假设应用程序服务器托管在一台服务器上,数据库托管在另一台服务器上。如果我们在服务器(托管应用程序服务器)上实时发现 CPU 使用率高/速度慢,那么我们会进行线程转储并根据以下规则找出“罪魁祸首”线程:
1) 如果存在运行缓慢的 SQL(从 Web 应用程序内部触发)/数据库很慢,那么它永远不会导致托管应用程序服务器的服务器具有高 CPU 使用率。数据库缓慢只会使应用程序变慢。数据库缓慢会导致应用程序线程处于 BLOCKED/WAITING 状态,因为这些线程“战斗/竞争”以获得“有限”的数据库访问(典型的连接池内容)。
2)罪魁祸首始终是线程(处于可运行状态)在应用程序服务器层上执行某些 Activity ,例如在很长的 while 循环中运行和/或执行一些密集的操作/计算。
有人可以帮助验证上述理解吗?
最佳答案
确实,如果数据库是瓶颈,那么应用服务器通常不会有很高的 CPU 利用率。
确实,许多应用服务器线程处于 RUNNABLE 状态可能会导致 CPU 利用率高,但这并不总是导致 CPU 利用率高。
当应用程序服务器 JVM 内存不足(和/或应用程序生成大量垃圾)并且 JVM 在垃圾收集上花费过多的精力 (CPU) 时,会出现另一个主要替代方案。
有许多工具,例如 jvisualvm(包含在 JDK 中),可以立即明确问题所在。
关于java - 实时服务器 CPU 使用率高时的线程转储分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949918/
我是一名优秀的程序员,十分优秀!