【问题标题】:Tools to monitor java thread execution监控java线程执行的工具
【发布时间】:2011-01-14 03:38:42
【问题描述】:

我有一个在 Tomcat 服务器 (Linux) 上运行的 Java Web 应用程序。在生产环境中,我面临一些性能问题。运行 tomcat 的 jsvc 进程以随机间隔开始以 90-100% 的 CPU 运行。我无法找到此事件的触发器。服务器是一个四核系统。内存消耗不代表有任何异常。

如何监控应用程序中的哪个线程(应用程序堆栈跟踪)导致问题?

我正在检查jconsolePSI Probe,但两者都没有提供有关应用程序内部哪个线程导致 CPU 使用异常的任何详细信息。

【问题讨论】:

  • [javascript-performance] 标签有什么用?
  • @skaffman,对不起 java 性能,我已经更正了。
  • 我们的生产服务器也遇到了一些性能问题,因为将分析器附加到生产服务器很棘手。我们尝试了 NewRelic。这是为您的绩效调查添加的一个了不起的工具。

标签: java performance jvm


【解决方案1】:

一种相对简单的方法(这可能适用于您的情况,也可能不适用 - 取决于行为发生多长时间):

当您的应用表现出您想要调试的行为(在这种情况下,90-100% 的 CPU 使用率)时,在进程 ID 上使用 jstack:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

检查哪些线程正在运行以及它们以什么方法发生。如果您这样做几次,可能相对容易发现罪魁祸首调用链。然后,您可以调试该链的入口。

这不一定是最好或最优雅的方法,但它很容易做到,并且可能就是您所需要的。我会从那里开始。这类似于“printf 是我用过的最好的调试器”的理念。

【讨论】:

  • 我还要补充一点,像 JProfiler 这样的分析器可能会为您提供更多关于哪些线程正在做什么的指标,但如果问题相对简单,再次追踪这可能会非常耗时。所以我仍然要强调,在启动适当的分析器之前,需要对几个示例进行基于 jstack 的快速分析。
【解决方案2】:

VisualVM 是您正在寻找的。它附带较新的 JDK,并允许您监视 thread usage

【讨论】:

    【解决方案3】:

    另一个显示 CPU 消耗最高线程的工具是 jvmtop

    【讨论】:

      【解决方案4】:

      您可以通过向其发送 QUIT 信号来获取任何 Java 应用程序中所有线程的堆栈跟踪转储。

       kill -QUIT [processId]
      

      这将显示在进程的标准输出中。

      【讨论】:

        【解决方案5】:

        只是我的 2 美分,但我想知道您是否正在尝试内存问题,CPU 峰值可能是 GC 活动。因此,当您使用 jconsole 监视您的 tomcat 时,请查看内存选项卡并检查堆使用率是否不会很高。

        【讨论】:

          【解决方案6】:

          有一个名为“threadcpu”的 Linux 工具可以测量每个线程的 cpu 使用率。对于 Java 线程,它使用 jstack 来获取和打印线程名称。

          http://www.tuxad.com/blog/archives/2018/10/01/threadcpu_-_show_cpu_usage_of_threads/index.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-07
            相关资源
            最近更新 更多