Java 显示奇怪行为的视觉虚拟机

Java 显示奇怪行为的视觉虚拟机,java,multithreading,cpu,thread-sleep,java-threads,Java,Multithreading,Cpu,Thread Sleep,Java Threads,我正在使用VisualVM监视我的JBoss实例。我还附上了它的截图 问题是在我重新启动JBoss实例之后,操作系统上的CPU开始变高。负载可以高达40,top命令中的JAVA进程显示高达300%的使用率 然后,这会降低前端应用程序的速度 VisualVM显示CPU很高,线程数也在增加 我怎样才能进一步找到这一问题的根源 一个好的起点是生成堆转储,并使用堆转储分析器工具查看引擎盖下发生的事情,然后使用VisualVM进行浏览 对于您来说,一些免费的替代方案是或了解增加线程数是相当容易的。捕获几个

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

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

然后,这会降低前端应用程序的速度

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

我怎样才能进一步找到这一问题的根源


一个好的起点是生成堆转储,并使用堆转储分析器工具查看引擎盖下发生的事情,然后使用VisualVM进行浏览


对于您来说,一些免费的替代方案是或

了解增加线程数是相当容易的。捕获几个线程并比较创建的新线程


对于高CPU利用率,您必须使用Visual VM(如果此信息可用)或本机系统监视工具检测导致此问题的线程。您应该能够将线程ID映射到threaddump中的stacktrace,以查看真正的原因。

当涉及到高CPU使用率时,我通常会考虑两件事:

  • 频繁GC消耗CPU
  • 占用CPU的线程
  • 为了进一步诊断#1,启用GC日志可能是最好的方法。但是,您也可以使用jstat:

    jstat-gc PID 60s

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

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


    希望这有帮助。祝你好运

    是的,但是由于两个问题,我们很难从线程转储中找到它。 1.CPU利用率在15-20分钟内从20%快速增加到90%。我们无法在其他环境中这样做。 2.当我们进行线程转储时,可能导致问题的实际线程已经完成,我们发现其他线程正在等待资源

    是否有其他方法可以在服务器端进行配置或检查