我发现很多答案都指向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 aVirtualMachine
class, anywhere.
让我们开始 VirtualMachine
的 javadoc和 VirtualMachineDescriptor
显然,VirtualMachine
类是由 Java 类库定义的,因此该类存在。所以问题是为什么你无法在编译时和/或运行时找到类本身。
对于 Java 6 之前的较旧 JVM,VirtualMachine
类是半内部的,您需要从 tools.jar
文件访问它:
- How to import and use com.sun.jdi.VirtualMachine
- Accessing VirtualMachine and HotspotVirtualMachine classes from JDK1.5
当VirtualMachine
类成为Java 6中的官方API时,它的名称更改为com.sun.tools.attach.VirtualMachine
。但是,它仍然位于 tools.jar
文件中,而不是主 rt.jar
文件中。这种情况一直持续到(包括)Java 8。
在 Java 9 中,引入了模块系统,并且事情发生了变化。 rt.jar
或 tools.jar
不再存在。要立即访问这些类(Java 9 及以上版本),您需要在 module.info
文件中包含 requires jdk.attach
。
关于java - 在 OpenJDK 上运行时加载 java 代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742986/