0

基本上我想从我当前的系统 JMC 记录在 docker 上运行的应用程序事件(JFR 数据)。

后续步骤:

  1. 在我的 docker 服务上启用了 JFR 端口。
  2. 验证我是否能够从我当前的系统访问 docker 服务的 JMS 端口并且它工作正常。
  3. 当我尝试从 JMC 应用程序记录应用程序事件时,我在转储中获得了正确的数据,但是当我尝试使用命令行选项执行相同操作时,我没有获得正确的转储。
  4. 作为项目的一部分,我们确实有一个内部调用应用程序事件的批处理文件。我创建了一个本地 jar 文件,它将调用批处理文件并在该 jar 文件上运行 JFR 命令行选项,但我仍然没有得到正确的信息。在转储文件上。

有没有人提供任何建议。

4

2 回答 2

0

使用命令行选项时,即 -XX:StartFlightRecording:filename=dump.jfr(JDK 11 语法),需要指定允许写入文件的目录。默认情况下,它是启动 JVM 进程的目录。

如果您的意思是使用命令行工具,即 jcmd JFR.dump filename=dump.jfr,则在 Docker 容器中附加到 JVM 时会出现问题。“jcmd”工具找不到附加到容器中进程所需的文件所在的正确 /tmp 目录。见https://bugs.openjdk.java.net/browse/JDK-8228343

JMC 通过 JMX 从 /tmp 目录传输记录数据,因此可以避免该问题。您可以编写一个以编程方式转储的 Java 程序。飞行记录器MXBean

于 2019-11-09T03:16:18.840 回答
0

这是我遵循的实际过程。

  1. 我们确实有一个批处理文件来在我们的 Docker 上运行应用程序事件。
  2. 我准备了一个 java 程序来运行那个特定的批处理文件并生成一个可运行的 jar 文件。
  3. 现在,我使用 JFR 命令调用了那个特定的 jar 文件,以在我的系统上获取这些应用程序事件的转储,如下所示:

    -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=20s,duration=60s,name=Test, filename=recording.jfr,settings=profile -XX:FlightRecorderOptions =loglevel=info -jar sample.jar>

于 2019-11-09T15:01:59.153 回答