关于概要分析:如果您有一个Java应用程序在不执行任何操作时正在消耗CPU,那么您如何确定它在做什么?

关于概要分析:如果您有一个Java应用程序在不执行任何操作时正在消耗CPU,那么您如何确定它在做什么?

If you have a Java application that is consuming CPU when it isn't doing anything, how do you determine what it is doing?

我正在调用供应商的Java API,在某些服务器上,登录到API(CPU利用率为100%)后,JVM似乎进入了低优先级轮询循环。其他服务器上的同一应用程序不会表现出此行为。这在WebSphere和Tomcat上发生。该环境设置起来很棘手,因此很难尝试在Eclipse中进行诸如剖析之类的事情。

有没有一种方法可以分析(或其他检查方法)在Tomcat中运行的现有Java应用程序,以找出处于这种Spinwait状态下正在执行哪些方法?应用程序进入此状态时仅执行一种方法(供应商的方法)。供应商无法复制行为(当然)。

更新:

使用JConsole,我可以确定谁在运行以及他们在做什么。我花了几个小时才弄清楚为什么这样做。问题最终是所使用的供应商的API jar与所使用的数据库配置不完全匹配。默认情况下,在配置略有不匹配的服务器上启用跟踪和性能监视。我使用了另一个罐子,一切都很好。

谢谢约书亚,谢谢您的回答。 JConsole非常易于安装和监视现有应用程序。

@Cringe-我做了一些您建议的选项的实验。我在设置JProfiler时遇到了一些问题,它看起来不错(但价格昂贵)。展望未来,我继续前进并添加了Eclipse Profiler插件,我将研究不同的开源Profiler来比较功能。


如果您使用的是Java 5或更高版本,则可以使用jconsole连接到您的应用程序以查看所有正在运行的线程。 jstack也将执行堆栈转储。我认为,即使在像Tomcat这样的容器中,这也应该仍然有效。

这两个工具都包含在JDK5和更高版本中(我可能认为该过程至少需要Java 5,尽管我可能错了)

更新:
还值得注意的是,从JDK 1.6 update 7开始,现在有一个捆绑的名为VisualVM的探查器,可以通过" jvisualvm"启动它。看起来这是一个java.net项目,因此该页面上可能会提供其他信息。我还没有使用过它,但是对于更认真的分析它似乎很有用。

希望能有所帮助


面对同样的问题,我使用了YourKit分析器。除非您实际连接到加载器,否则它不会激活(尽管它确实会打开端口以监听连接)。探查器本身具有不错的"获取每种方法所花费的时间",同时在不太干扰的模式下工作。

另一种方法是在具有最高优先级的"看门狗"线程中检测CPU负载(通过JNI,因此您需要一个外部库),并在CPU足够长时间足够高时开始记录所有线程。您可能会发现本文很有启发性。


如果是出于专业目的,并且您有一些钱可以花,请尝试使用JProfiler。如果您只是想获得一些见识,请尝试使用Eclipse Profiler插件。我使用了几次,但是我不知道当前状态。

也可以使用eclipse项目本身的一个new(?)项目:http://www.eclipse.org/tptp/(请参阅本文)。从未使用过它,所以我不知道是否值得付出努力。

在http://www.manageability.org/blog/stuff/open-source-profilers-for-java上也有很多很好的开源分析器列表


JRockit任务控制延迟分析器。

JRockit随附的延迟分析器向您显示JVM在不执行任何操作时正在执行的操作。在最新版本中,您可以看到以下延迟:

  • Java等待/阻止/睡眠/停放。
  • 文件I / O
  • 网络I / O
  • 内存分配
  • GC暂停
  • JVM延迟,例如代码生成和类加载
  • 螺纹悬挂

发生延迟时,该工具将为您提供堆栈跟踪。您可以通过许多不同的方式查看等待时间数据(聚集的迹线,如直方图,线程图等)。该工具还允许您查看线程之间的过渡,例如当一个线程通知另一个线程时。

延迟分析器/d/jc/2023041207/yf0bnz214am14.webp

开销可以忽略不计,并且与许多其他工具不同,它可以在生产环境中使用。
这篇博客文章为您提供了简短的介绍,该程序可以在这里下载。

免费用于开发!


如果无法使用JConsole,则可以

  • 在Windows下按CTRL + BREAK
  • 在Linux下发送kill -3

获得完整的线程转储。这不会影响性能,并且始终可以在生产环境中运行。


使用探查器。是的,它们花钱,偶尔使用它们会有些尴尬,但是它们确实为您提供了更多更真实的证据,而不是猜测。

人类普遍都无法猜测性能瓶颈在哪里。似乎这并不是我们的大脑无法很好地完成的事情。看起来似乎很明显,您可能对问题所在有很好的主意,但是现实世界中经常发现这样做是不同的。优化代码的错误部分最多意味着要花最少的功夫。通常,它会使事情变慢,有时会完全破坏事情。因此,在为进行优化而进行任何更改之前,应该始终从分析器或其他准确的工具获得真实证据。

如前所述,JProfiler和YourKit都相当不错,而且价格也不算昂贵。上次查看时,他们俩也都有免费的演示。


VisualVM应该作为独立于netbeans的探查器。我尝试了Eclipse的TPTP,但visualVm似乎是一个更好的选择!


为了完整起见:即使我的公司或多或少都在Eclipse上进行了标准化,我们仍每天使用Netbeans(6及更高版本)及其附带的免费事件探查器。它比Eclipse TPTP插件(最近检查了3个月前)更好,并且对我们来说,它不需要JProfiler这样的商业分析器,这很好,但很快变得不必要。


推荐阅读