我正在使用 VisualVM 来监视我的 JBoss 实例。我还附上了它的屏幕截图。
问题是在我重新启动 JBoss 实例后,操作系统上的 CPU 开始变高。负载可能高达 40,并且 top 命令中的 JAVA 进程显示高达 300% 的使用率。
这会继续减慢前端应用程序的速度。
VisualVM 显示 CPU 很高,并且线程数也在增加。
我怎样才能进一步找到这个问题的根本原因?
最佳答案
当谈到高 CPU 使用率时,我通常会寻找两件事:
- 频繁GC消耗CPU
- 消耗 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/