Java Mission Control Flight Recorder 中没有记录 CPU 使用情况

Posted

技术标签:

【中文标题】Java Mission Control Flight Recorder 中没有记录 CPU 使用情况【英文标题】:no CPU usage recorded in Java Mission Control Flight Recorder 【发布时间】:2013-10-24 07:47:55 【问题描述】:

今天我查看了 Java 7 更新 45 中引入的 Mission Control,并使用 Flight Recorder 进行了一些测试。一切似乎都按预期工作,我从我测试的应用程序中获得了大量关于线程、内存和任何内容的数据。只有一件事对我来说似乎很奇怪:在“常规”类别中,没有显示 CPU 使用情况,在 CPU 使用情况的图标下方只有一句话“记录中没有事件”。当我不使用 Flight Recording 而是使用 JMX 控制台时,CPU 使用率显示在同一个应用程序中。在创建飞行记录期间,我将大部分设置保留为默认值,但确保在“用于分析的事件详细信息”页面上启用“操作系统/处理器/CPU 负载”并配置了 1000 毫秒的周期,这应该足以使用几分钟的测试时间获得一些数据。

我有什么遗漏的吗?可能是由于性能原因的限制,我需要激活其他的东西吗?

感谢您的建议!

【问题讨论】:

【参考方案1】:

抱歉,回答有点晚,但我想我知道您可能遇到什么问题:

您是否正在运行本地化版本的 Windows?

我设法引入了一个错误,其中我硬编码了一个 PDH 查询路径以使用“Process”PDH 对象字符串,例如:“\Process(%s#%d)\%s”。当然,Windows 的本地化版本不保证“进程”字符串,它应该通过注册表索引解决。

我已经在 9 和 8 中修复了这个问题,我认为 7 行的反向移植也在进行中。

请查看此错误:https://bugs.openjdk.java.net/browse/JDK-8043323

谢谢 马库斯

【讨论】:

是的,我运行的是德文版的 Windows,但是从德文的安装介质,我之后没有安装任何语言包之类的。 好的,那么这很可能是您的问题。道歉。【参考方案2】:

在 JVM 附带的两个模板中默认启用 CPU 负载(1000 毫秒)。

如果您不在向导的高级部分修改设置,您是否会遇到同样的问题?如果您只是从录制向导的第一页单击新模板上的完成?

【讨论】:

是的,在默认配置文件和不同应用程序(例如Eclipse 本身和 DbVisualizer。 您可以尝试将 -XX:FlightRecorderOptions=loglevel=trace 添加到命令行。如果 JVM 无法从操作系统获取 CPU 使用情况,例如,如果在 Windows 的注册表中禁用了性能计数器,您应该在日志中看到它。 你是对的,我收到以下错误:无法生成可请求事件 CPULoad 知道为什么吗?我没有禁用性能计数器,如果我使用 JMX 控制台,我可以看到 JVM 和“机器”的 CPU 使用情况。【参考方案3】:

感谢 Kire Haglin 的帮助,我知道要搜索什么并发现以下错误:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8019921

我不明白的是,关于 backport-Bugs 的问题应该已经在 u45 中修复了:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8021038

但它仍然对我和我的应用程序(如 Eclipse、DbVisuliazer、Eclipse 中的 Tomcat 等)不起作用。看起来我会看看是否能够重新打开该错误。

我的 java -version 输出:

Java HotSpot(TM) 客户端 VM(内部版本 24.45-b08,混合模式,共享)

建议“b53”,如主要错误中所述,如果问题得到修复,可能是 JRE/JDK 的下一个版本。一个反向移植错误也被定位为JRE 7u60。

【讨论】:

该错误已在 7u40 中修复,但很可能与性能计数器有关。 JMX 使用另一种机制。我假设您已经看到了这一点,docs.oracle.com/cd/E15289_01/doc.40/e15066/… 正如您所说的 perf os 计数器未被禁用。对不起,我不能提供更多帮助。你是什​​么版本的Windows?您是否以管理员身份运行? 不,我没有在我的跟踪日志中看到您链接的错误消息,只有我之前提到的 CPULoad-sentence。我正在使用 Windows 7 64 位,完全更新,不,我没有以管理员身份运行。相反,我使用的是“用户”成员的用户,这意味着如果 UAC 弹出,我必须提供管理员帐户的密码。我会以管理员身份尝试,非常感谢您的帮助! 仅以管理员身份运行 JMC 不起作用,因为它看不到我的进程以普通用户身份启动。将我的用户添加到管理员组也没有改变任何东西,在这种情况下,它看到了我的进程,但仍然没有记录任何 CPU 负载。如果我通过 UAC 启动 JMC,而我的用户仍然是管理员的成员,则 JMC 根本看不到我的任何进程。似乎我在没有 CPU 负载的情况下被卡住了,即使它可以工作,启动使用 UAC 提升的所有进程根本不是一个选项。 你能在 perfmon.exe 中看到 CPU 时间吗?性能监视器 -> 添加 -> 进程 -> 选择一个 JDK 7u40 实例 -> 用户时间和进程时间。 是的,这确实适用于以 javaw.exe 或 eclipse.exe 或 dbvis.exe 形式运行 JRE 的不同应用程序。但是 JMC 中仍然没有 CPULoad 事件,即使我首先启动 JMC,然后再启动其他应用程序进行测试。我迷路了,我看不出我做错了什么......:-/

以上是关于Java Mission Control Flight Recorder 中没有记录 CPU 使用情况的主要内容,如果未能解决你的问题,请参考以下文章

Java Mission Control - 访问被拒绝连接到远程

Java Mission Control:飞行记录器抛出:javax.naming.ServiceUnavailableException

Java Mission Control Flight Recorder 中没有记录 CPU 使用情况

仍然可以使用 Java Mission Control 连接到远程 JMX 但证书已过期?

深入理解java虚拟机(十三)Java Mission Control:可持续在线的监控工具

使用 Flight Recorder 和 JDK Mission Control 计算更多方法