如果你的Java应用程序在没有做任何事情时正在消耗CPU,你如何确定它在做什么?

时间:2008-08-16 00:45:38

标签: java profiling

我正在调用供应商的Java API,并且在某些服务器上,似乎JVM在登录API(CPU使用率为100%)后进入低优先级轮询循环。其他服务器上的相同应用程序不会出现此行为。这发生在WebSphere和Tomcat上。设置环境很棘手,因此很难尝试在Eclipse中进行分析。

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


更新:

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

非常感谢,约书亚,你的回答。 JConsole非常易于设置和用于监视现有应用程序。

@Cringe - 我做了一些你建议的一些选项的实验。设置JProfiler时遇到了一些问题,看起来不错(但价格昂贵)。继续前进我继续添加Eclipse Profiler插件,我将查看不同的开源分析器来比较功能。

8 个答案:

答案 0 :(得分:15)

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

这两个工具都包含在JDK5及更高版本中(我假设该过程至少需要Java 5,但我可能错了)

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

希望有所帮助

答案 1 :(得分:6)

面对同样的问题,我使用了YourKit profiler。它的加载器不会激活,除非您实际连接到它(虽然它确实打开一个端口来侦听连接)。探查器本身有一个很好的“在每种方法中花费的时间”,而在它的工作中则不那么突兀。

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

答案 2 :(得分:2)

如果无法使用JConsole,您可以

  • 在Windows下按 CTRL + BREAK
  • 在Linux下发送kill -3 <process id>

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

答案 3 :(得分:2)

JRockit Mission Control Latency Analyzer。

JRockit附带的Latency Analyzer可以显示JVM在没有做任何事情时“正在做什么”。在最新版本中,您可以看到延迟:

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

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

latency analyzer http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

开销可以忽略不计,与许多其他工具不同,它可以在生产环境中使用。 这个blog post为您提供了简要介绍,可以下载程序here

它可以免费用于开发!

答案 4 :(得分:2)

如果是出于专业目的并且您有一些钱可以花钱,请尝试开始JProfiler。如果您只想获得一些见解,请试用Eclipse Profiler Plugin。我曾多次使用它,但我不知道目前的状态。

eclipse项目本身的新(?)项目也可用:http://www.eclipse.org/tptp/(参见this article)。从来没有使用它,所以我不知道是否值得努力。

http://www.manageability.org/blog/stuff/open-source-profilers-for-java

还提供了很好的开源分析器列表

答案 5 :(得分:1)

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

人们普遍不愿意猜测性能瓶颈在哪里。它似乎是我们的大脑不能很好地建立的东西。看起来很明显,你可能对问题是什么有很好的想法,但现实世界常常会做出不同的事情。并且优化错误的代码部分意味着充其量只需要很少的工作以获得最小的利益。更常见的是,它会使事情变得更慢,有时它会完全破坏事物。因此,在您进行任何更改以进行优化之前,您应该始终从分析器或其他准确工具中获得真实证据。

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

答案 6 :(得分:0)

为了完整起见:即使我的公司或多或少标准化Eclipse,我们每天使用Netbeans(6及以上)及其included, free profiler。它比Eclipse TPTP插件(最后一次检查3个月前)更好用,对我们来说它不需要像JProfiler这样的商业分析器,这很好,但很快就变得不必要了。

答案 7 :(得分:0)

VisualVM应该是netbeans的独立分析器。我尝试了TPTP for eclipse,但visualVm似乎是一个更好的选择!