如果您的 Java 应用程序在不执行任何操作时正在消耗 CPU,那么如何确定它正在执行什么操作?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

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

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


更新:

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

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

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

有帮助吗?

解决方案

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

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

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

希望有帮助

其他提示

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

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

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

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

还有一个非常好的开源分析器列表,位于 http://www.manageability.org/blog/stuff/open-source-profilers-for-java

JRockit 任务控制延迟分析器。

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

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

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

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

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

它可以免费用于开发!

如果 JConsole 无法使用,您可以

  • 控制键+休息 在Windows下
  • 发送 kill -3 <process id> Linux下

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

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

人类普遍不擅长猜测性能瓶颈在哪里。我们的大脑似乎并不能很好地完成这件事。这似乎是显而易见的,你可能对问题是什么有很好的想法,但现实世界往往会做一些不同的事情。优化代码的错误部分充其量意味着大量工作却收效甚微。更多时候它会让事情变得更慢,有时甚至会完全破坏事情。因此,在为了优化而进行任何更改之前,您应该 总是 有来自分析器或其他准确工具的真实证据。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top