16

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

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


更新:

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

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

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

4

8 回答 8

18

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

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

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

希望有帮助

于 2008-08-16T02:12:04.090 回答
7

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

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

于 2008-08-16T18:26:17.587 回答
3

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

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

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

于 2008-08-16T05:40:53.403 回答
3

如果无法使用 JConsole,您可以

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

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

于 2008-08-23T08:22:58.703 回答
2

JRockit 任务控制延迟分析器。

JRockit 附带的延迟分析器向您显示当 JVM 什么都不做时它正在“做什么”。在最新版本中,您可以看到以下延迟:

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

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

延迟分析器 http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

开销可以忽略不计,并且与许多其他工具不同,它可以在生产环境中使用。这篇文给你一个简单的介绍,程序可以在这里下载。

它可以免费用于开发!

于 2008-09-29T21:00:24.403 回答
1

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

人类普遍不善于猜测性能瓶颈在哪里。这似乎是我们的大脑不能很好地完成的事情。看起来很明显,您可能对问题所在有很好的想法,但现实世界往往会做一些不同的事情。优化代码的错误部分,充其量意味着做大量工作以获取最小的收益。更常见的是,它会使事情变慢,有时它会完全破坏事情。因此,在为优化而进行任何更改之前,您应该始终拥有来自分析器或其他准确工具的真实证据。

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

于 2008-08-21T12:49:59.327 回答
0

为了完整起见:即使我的公司或多或少地在 Eclipse 上标准化,我们每天都使用 Netbeans(6 及更高版本)及其包含的免费分析器。它比 Eclipse TPTP 插件(3 个月前最后一次检查)工作得更好,对我们来说,它消除了对 JProfiler 等商业分析器的任何需求,它非常好,但很快就变得不必要了。

于 2008-08-19T18:50:40.873 回答
0

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

于 2008-08-21T11:51:46.923 回答