在 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.jar
或 tools.jar
都不存在了。要立即访问这些 classes(Java 9 之后),您需要在 module.info
文件中包含 requires jdk.attach
。
我找到了很多指向我 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 aVirtualMachine
class, anywhere.
让我们开始 VirtualMachine
and VirtualMachineDescriptor
显然,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.jar
或 tools.jar
都不存在了。要立即访问这些 classes(Java 9 之后),您需要在 module.info
文件中包含 requires jdk.attach
。