在 OpenJDK 运行时加载 java 代理?

Load a java agent during runtime on OpenJDK?

我找到了很多指向我 VirtualMachine#loadAgent 的答案,这真的很棒,除非我在任何地方都没有 VirtualMachine class。我对此也很困惑,但是我似乎没有任何 Attach API。我正在使用 OpenJDK 8:

$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b05)
OpenJDK 64-Bit Server VM (build 25.222-b05, mixed mode)

还有哪些其他方法可以加载 java 代理?我工作的环境在传递 -javaagent: 参数方面几乎没有成功,因为它意味着在运行时被注入到 class 路径中,显然任何普通用户都不会想要 to/have 为我的特定程序手动更改 JVM args 的知识。

另一方面,为了确保这个 class 是 OpenJDK 的一部分,而不是专为 java 热点 VM 设计的东西,我下载了 OpenJDK 代码来自 http://hg.openjdk.java.net/,并找到了 VirtualMachine.java 文件,这意味着它肯定存在

I've found many answers pointing me to VirtualMachine::loadAgent, which would honestly be great, except I don't have a VirtualMachine class, anywhere.

让我们开始 VirtualMachine and VirtualMachineDescriptor

的 javadoc

显然,VirtualMachine class 是由 Java class 库定义的,因此存在 class。所以问题是为什么在编译时and/or在运行时找不到class本身。

对于 Java 6 之前的旧 JVM,VirtualMachine class 是半内部的,您需要从 tools.jar 文件访问它:

  • How to import and use com.sun.jdi.VirtualMachine
  • Accessing VirtualMachine and HotspotVirtualMachine classes from JDK1.5

VirtualMachine class 于Java 6 年转正 API 后,更名为 com.sun.tools.attach.VirtualMachine。但是,它仍然在 tools.jar 文件中,而不是主 rt.jar 文件中。这一直持续到(包括)Java 8.

在Java9 中,引入了模块系统,并且发生了一些变化。 rt.jartools.jar 都不存在了。要立即访问这些 classes(Java 9 之后),您需要在 module.info 文件中包含 requires jdk.attach