java - 在 OpenJDK 上运行时加载 java 代理?

标签 java attach-api

我发现很多答案都指向VirtualMachine#loadAgent,这确实很棒,只是我在任何地方都没有 VirtualMachine 类。我对此也很困惑,但是我似乎没有任何 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: 参数方面几乎没有成功,因为它意味着在运行时注入(inject)到类路径中,显然任何普通用户都不会想要/具备针对我的特定程序手动更改 JVM 参数的知识。

另一方面,为了确保此类是 OpenJDK 的一部分,因为它不是专为 java 热点 VM 设计的,我从 http://hg.openjdk.java.net/ 下载了 OpenJDK 代码。 ,并找到了 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 的 javadoc和 VirtualMachineDescriptor

显然,VirtualMachine 类是由 Java 类库定义的,因此该类存在。所以问题是为什么你无法在编译时和/或运行时找到类本身。

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

VirtualMachine类成为Java 6中的官方API时,它的名称更改为com.sun.tools.attach.VirtualMachine。但是,它仍然位于 tools.jar 文件中,而不是主 rt.jar 文件中。这种情况一直持续到(包括)Java 8。

在 Java 9 中,引入了模块系统,并且事情发生了变化。 rt.jartools.jar 不再存在。要立即访问这些类(Java 9 及以上版本),您需要在 module.info 文件中包含 requires jdk.attach

关于java - 在 OpenJDK 上运行时加载 java 代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742986/

相关文章:

java - Java越界错误

java - 如何将java程序连接到dashdb?

Java System.out.println() 影响程序流程

Java:RMI 与 Web 服务

java - quartz 调度器 : Schedule job on second last day of month

java - 加载位于加载器内的 Java 代理 JAR

java - 在 Java 9 中以编程方式连接到 JMX 代理