java - 视觉虚拟机表现出奇怪的行为

标签 java multithreading cpu thread-sleep java-threads

我正在使用 VisualVM 来监视我的 JBoss 实例。我还附上了它的屏幕截图。

问题是在我重新启动 JBoss 实例后,操作系统上的 CPU 开始变高。负载可能高达 40,并且 top 命令中的 JAVA 进程显示高达 300% 的使用率。

这会继续减慢前端应用程序的速度。

VisualVM 显示 CPU 很高,并且线程数也在增加。

我怎样才能进一步找到这个问题的根本原因?

Visual VM output - General

最佳答案

当谈到高 CPU 使用率时,我通常会寻找两件事:

  1. 频繁GC消耗CPU
  2. 消耗 CPU 的线程

要进一步诊断#1,启用 GC 日志记录可能是最好的方法。但是,您也可以使用 jstat:

jstat -gc PID 60s

上面的命令将每 60 秒从 JVM 收集一次内存使用情况和垃圾收集详细信息。在调试环境中,60s应该可以,但在生产环境中3600s应该足够了。 jstat 的重量非常轻,不会产生任何不利影响。输出将帮助您了解是否存在频繁的 GC(主要/次要)。频繁的主要收集肯定是一个问题(它会暂停应用程序),但是,非常频繁的次要收集也可能导致 CPU 过高(应用程序过于频繁地创建过多的垃圾)。如果是这种情况,您可能需要进行头转储,并且需要了解应用程序的内存使用详细信息,但在此之前不需要。请记住,捕获堆转储可能会“挂起”您的应用程序(我不建议在生产中这样做,除非您可以在捕获数据后立即重新启动应用程序)。

为了诊断 #2,“top”提供了一个选项(“H”)来检查各个线程消耗的 CPU。这将(实时)指出正在消耗 CPU 的应用程序线程。另外(正如其他人所建议的那样),以每个 10 秒的间隔捕获 5/6 个线程转储。查找处于 RUNNABLE 状态的线程。这些是正在工作并因此占用 CPU 的线程。同一(组)线程是否在多个转储中陷入可运行状态?可能你有问题。

希望这有帮助。祝你好运!

关于java - 视觉虚拟机表现出奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907954/

相关文章:

java - 使用拦截器的 CXF 的 ws-security

c++ - 有多少 "large"对象被带入缓存?

linux - 无法测量的 CPU 使用率?

c - 分离的线程不会同时运行

python - 并行目录遍历 python

java - 为什么这段 Java 代码没有利用所有 CPU 内核?

java - Hibernate:将属性字段设置为静态最终对象实例

java - 为什么扩展的 for 循环不适用于迭代器?

java - 如何从两个单独的 ArrayList 中删除重复的对象?

c# - 需要改进的线程锁定建议