0

我找到了许多指向我的答案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:参数方面几乎没有成功,因为它意味着在运行时被注入到类路径中,显然任何普通用户都不想/有知识来手动更改 JVM 参数对于我的具体程序。

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

4

1 回答 1

4

我找到了许多指向我的答案VirtualMachine::loadAgent,老实说,这会很棒,除非我在任何地方都没有VirtualMachine课程。

让我们开始这个 javadocsVirtualMachineVirtualMachineDescriptor

显然,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.jar也不tools.jar存在。要立即访问这些类(Java 9 及更高版本),您需要将其包含requires jdk.attachmodule.info文件中。

于 2019-09-01T04:52:56.220 回答