从附加代理启动 JavaFlightRecorder 或使用 com.sun.tools.attach.*;
Start JavaFlightRecorder from attached agent or by using com.sun.tools.attach.*;
是否可以构建自定义代理(或重用现有代理)以在 HotSpot VM 中启用 JFR 功能?
我的计划是构建使用 com.sun.tools.attach.*
包附加到 VM 并加载自定义代理的简单代理加载程序。
我没有故意使用 jcmd 或其他 JDK 工具,因为我无法控制环境,因为应用程序 运行 在我无法控制的容器中 [=22] =] 和 jcmd 的 ABI(所以我不能将 JDK 的部分内容复制到 运行 命令)。
我知道代理几乎可以做任何事情,因为 jcmd 是用 java 编写的,它能够在飞行时启动 FlightRecording(我假设通过一些 JMX)那么它也应该可以通过 java 代理,但我找不到相关文档。
任何线索都会有所帮助。谢谢
动态附加 API (com.sun.tools.attach) 不适用于 JRE 8,因为它需要包含在 JDK 中的 tools.jar
和 libattach.so
,但 JRE 中没有。
jattach 是一个用 C 编写的小型独立实用程序;它为 JRE 提供动态附加功能,可以用来代替 jcmd:
jattach <pid> jcmd "JFR.start ..."
如果您更喜欢Java API,您可以使用ByteBuddyAgent。它还提供不依赖于 com.sun.tools.attach.
的动态附加功能
try (VirtualMachine.ForHotSpot.Connection conn =
VirtualMachine.ForHotSpot.Connection.ForJnaPosixSocket.Factory
.withDefaultTemporaryFolder(30, 100, TimeUnit.MILLISECONDS)
.connect(pid)) {
conn.execute("1", "jcmd", "JFR.start", null, null);
}
是否可以构建自定义代理(或重用现有代理)以在 HotSpot VM 中启用 JFR 功能?
我的计划是构建使用 com.sun.tools.attach.*
包附加到 VM 并加载自定义代理的简单代理加载程序。
我没有故意使用 jcmd 或其他 JDK 工具,因为我无法控制环境,因为应用程序 运行 在我无法控制的容器中 [=22] =] 和 jcmd 的 ABI(所以我不能将 JDK 的部分内容复制到 运行 命令)。
我知道代理几乎可以做任何事情,因为 jcmd 是用 java 编写的,它能够在飞行时启动 FlightRecording(我假设通过一些 JMX)那么它也应该可以通过 java 代理,但我找不到相关文档。
任何线索都会有所帮助。谢谢
动态附加 API (com.sun.tools.attach) 不适用于 JRE 8,因为它需要包含在 JDK 中的 tools.jar
和 libattach.so
,但 JRE 中没有。
jattach 是一个用 C 编写的小型独立实用程序;它为 JRE 提供动态附加功能,可以用来代替 jcmd:
jattach <pid> jcmd "JFR.start ..."
如果您更喜欢Java API,您可以使用ByteBuddyAgent。它还提供不依赖于 com.sun.tools.attach.
的动态附加功能try (VirtualMachine.ForHotSpot.Connection conn =
VirtualMachine.ForHotSpot.Connection.ForJnaPosixSocket.Factory
.withDefaultTemporaryFolder(30, 100, TimeUnit.MILLISECONDS)
.connect(pid)) {
conn.execute("1", "jcmd", "JFR.start", null, null);
}