首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果你有一个Java应用程序在没有做任何事情时消耗CPU,你如何确定它在做什么?

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

Stack Overflow用户
提问于 2018-10-19 05:25:22
回答 2查看 0关注 0票数 0

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

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

更新:

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-19 14:19:51

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-10-19 14:59:53

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

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

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

希望有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档