基本上,我想记录当前系统JMC在docker上运行的应用程序事件(JFR数据)。
遵循的步骤:
在我的docker服务上启用了JFR端口。
验证我是否能够从当前系统访问docker服务的JMS端口,并且该端口运行正常。
当我尝试从JMC应用程序记录应用程序事件时,我在转储上获取了正确的数据,但是当我尝试使用命令行选项执行相同的操作时,却没有获得正确的转储。
作为项目的一部分,我们确实有一个批处理文件,该文件在内部调用应用程序事件。我创建了一个本地jar文件,该文件将调用批处理文件并在该jar文件上运行JFR命令行选项,但仍然没有得到正确的信息。转储文件上。
有人提供任何建议吗?
最佳答案
使用命令行选项时,即-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目录传输记录数据,因此可以避免此问题。您可以编写一个使用。FlightRecorderMXBean以编程方式转储的Java程序。