VirtualMachine 表示此 Java 虚拟机已附加到的 Java 虚拟机。它所连接的 Java 虚拟机有时称为目标虚拟机, 或者目标虚拟机.应用程序(通常是管理控制台或分析器等工具)使用 VirtualMachine 将代理加载到目标 VM 中。例如,用 Java 语言编写的分析器工具可能附加到正在运行的应用程序并加载其分析器代理以分析正在运行的应用程序。
VirtualMachine 是通过使用标识目标虚拟机的标识符调用 attach 方法获得的。标识符是依赖于实现的,但在每个 Java 虚拟机在其自己的操作系统进程中运行的环境中通常是进程标识符(或 pid)。或者,通过使用从 list 方法返回的虚拟机描述符列表中获得的 VirtualMachineDescriptor 调用 attach 方法来获取 VirtualMachine 实例。一旦获得对虚拟机的引用,就会使用 loadAgent 、 loadAgentLibrary 和 loadAgentPath 方法将代理加载到目标虚拟机中。 loadAgent 方法用于加载用 Java 语言编写并部署在 JAR file 中的代理。 (有关如何加载和启动这些代理的详细说明,请参阅 java.lang.instrument )。 loadAgentLibrary 和 loadAgentPath 方法用于加载部署在动态库中或静态链接到 VM 的代理,并使用 JVM 工具接口 。
除了加载代理之外,虚拟机还提供对目标 VM 中的system properties 的读取访问。这在某些环境中很有用,在这些环境中,诸如 java.home 、 os.name 或 os.arch 等属性用于构造将加载到目标 VM 中的代理的路径。
以下示例演示了如何使用 VirtualMachine:
// attach to target VM
VirtualMachine vm = VirtualMachine.attach("2177");
// start management agent
Properties props = new Properties();
props.put("com.sun.management.jmxremote.port", "5000");
vm.startManagementAgent(props);
// detach
vm.detach();
在此示例中,我们附加到由进程标识符 2177 标识的 Java 虚拟机。然后使用提供的参数在目标进程中启动 JMX 管理代理。最后,客户端与目标 VM 分离。
VirtualMachine 可以安全地供多个并发线程使用。
- 自从:
- 1.6
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述static VirtualMachine附加到 Java 虚拟机。static VirtualMachine附加到 Java 虚拟机。abstract voiddetach()与虚拟机分离。boolean测试此 VirtualMachine 是否与另一个对象相等。abstract Properties返回当前代理属性在目标虚拟机中。abstract Properties返回目标虚拟机中的当前系统属性。inthashCode()返回此 VirtualMachine 的哈希码值。final Stringid()返回此 Java 虚拟机的标识符。static List<VirtualMachineDescriptor>list()返回 Java 虚拟机列表。void加载代理。abstract void加载代理。voidloadAgentLibrary(String agentLibrary) 加载代理库。abstract voidloadAgentLibrary(String agentLibrary, String options) 加载代理库。voidloadAgentPath(String agentPath) 通过完整路径名加载本机代理库。abstract voidloadAgentPath(String agentPath, String options) 通过完整路径名加载本机代理库。final AttachProviderprovider()返回创建此虚拟机的提供者。abstract String在目标虚拟机中启动本地 JMX 管理代理。abstract voidstartManagementAgent(Properties agentProperties) 在目标虚拟机中启动 JMX 管理代理。toString()返回VirtualMachine的字符串表示形式。
-
构造方法详细信息
-
VirtualMachine
初始化此类的新实例。- 参数:
provider- 创建此类的附加提供程序。id- 标识 Java 虚拟机的抽象标识符。- 抛出:
NullPointerException- 如果provider或id是null。
-
-
方法详情
-
list
返回 Java 虚拟机列表。此方法返回 Java
VirtualMachineDescriptor元素的列表。该列表是通过调用所有已安装attach providers的listVirtualMachines方法获得的虚拟机描述符列表的集合。如果没有任何提供者已知的 Java 虚拟机,则返回一个空列表。- 返回:
- 虚拟机描述符列表。
-
attach
附加到 Java 虚拟机。此方法通过调用
AttachProvider.providers()方法获取附加提供程序列表。然后它遍历列表并依次调用每个提供者的attachVirtualMachine方法。如果提供者成功附加,则迭代终止,并且由成功附加的提供者创建的 VirtualMachine 通过此方法返回。如果所有提供者的attachVirtualMachine方法抛出AttachNotSupportedException那么这个方法也会抛出AttachNotSupportedException。这意味着当提供给此方法的标识符无效时,将抛出AttachNotSupportedException,或者标识符对应于不存在的 Java 虚拟机,或者没有提供者可以附加到它。如果AttachProvider.providers()返回空列表,也会抛出此异常。- 参数:
id- 标识 Java 虚拟机的抽象标识符。- 返回:
- 代表目标 VM 的 VirtualMachine。
- 抛出:
SecurityException- 如果已安装安全管理器并且它拒绝AttachPermission("attachVirtualMachine")或实施所需的其他权限。AttachNotSupportedException- 如果所有已安装提供程序的attachVirtualmachine方法抛出AttachNotSupportedException,或者没有安装任何提供程序。IOException- 如果发生 I/O 错误NullPointerException- 如果id是null。
-
attach
public static VirtualMachine attach(VirtualMachineDescriptor vmd) throws AttachNotSupportedException , IOException 附加到 Java 虚拟机。此方法首先调用给定虚拟机描述符的
provider()方法来获取附加提供程序。然后调用附加提供程序的attachVirtualMachine附加到目标 VM。- 参数:
vmd- 虚拟机描述符。- 返回:
- 代表目标 VM 的 VirtualMachine。
- 抛出:
SecurityException- 如果已安装安全管理器并且它拒绝AttachPermission("attachVirtualMachine")或实施所需的其他权限。AttachNotSupportedException- 如果附加提供者的attachVirtualmachine抛出AttachNotSupportedException。IOException- 如果发生 I/O 错误NullPointerException- 如果vmd是null。
-
detach
与虚拟机分离。从虚拟机分离后,任何进一步尝试调用该虚拟机上的操作都将导致抛出
IOException。如果在调用此方法时正在进行操作(例如loadAgent),则该行为取决于实现。换句话说,操作完成或抛出IOException是特定于实现的。如果已经与虚拟机分离,则调用此方法无效。
- 抛出:
IOException- 如果发生 I/O 错误
-
provider
返回创建此虚拟机的提供者。- 返回:
- 创建此虚拟机的提供商。
-
id
返回此 Java 虚拟机的标识符。- 返回:
- 此 Java 虚拟机的标识符。
-
loadAgentLibrary
public abstract void loadAgentLibrary(String agentLibrary, String options) throws AgentLoadException , AgentInitializationException , IOException 加载代理库。JVM TI 客户端称为代理人.它是用母语开发的。 JVM TI 代理以特定于平台的方式部署,但它通常是动态库的平台等价物。或者,它可以静态链接到 VM。此方法导致将给定的代理库加载到目标 VM 中(如果尚未加载或未静态链接到 VM 中)。然后,它会导致目标 VM 调用
Agent_OnAttach函数,或者对于名为“L”的静态链接代理,调用 JVM 工具接口 规范中指定的Agent_OnAttach_L函数。请注意,即使在调用此方法之前加载了代理库,也会调用Agent_OnAttach[_L]函数。提供的代理库是代理库的名称。它以依赖于实现的方式在目标虚拟机中进行解释。通常,一个实现会将库名称扩展为操作系统特定的文件名。例如,在 UNIX 系统上,名称
L可能会扩展为libL.so,并使用LD_LIBRARY_PATH环境变量指定的搜索路径进行定位。如果名为“L”的代理静态链接到 VM,则 VM 必须导出名为Agent_OnAttach_L的函数。如果代理库中的
Agent_OnAttach[_L]函数返回错误,则会抛出AgentInitializationException。然后可以通过对异常调用returnValue方法来获取Agent_OnAttach[_L]的返回值。- 参数:
agentLibrary- 代理库的名称。options- 提供给Agent_OnAttach[_L]函数的选项(可以是null)。- 抛出:
AgentLoadException- 如果代理库不存在,则代理库未静态链接到 VM,或者由于其他原因无法加载代理库。AgentInitializationException- 如果Agent_OnAttach[_L]函数返回错误。IOException- 如果发生 I/O 错误NullPointerException- 如果agentLibrary是null。- 参见:
-
loadAgentLibrary
public void loadAgentLibrary(String agentLibrary) throws AgentLoadException , AgentInitializationException , IOException 加载代理库。这个方便的方法就像调用一样:
loadAgentLibrary(agentLibrary, null);- 参数:
agentLibrary- 代理库的名称。- 抛出:
AgentLoadException- 如果代理库不存在,则代理库未静态链接到 VM,或者由于其他原因无法加载代理库。AgentInitializationException- 如果Agent_OnAttach[_L]函数返回错误。IOException- 如果发生 I/O 错误NullPointerException- 如果agentLibrary是null。
-
loadAgentPath
public abstract void loadAgentPath(String agentPath, String options) throws AgentLoadException , AgentInitializationException , IOException 通过完整路径名加载本机代理库。JVM TI 客户端称为代理人.它是用母语开发的。 JVM TI 代理以特定于平台的方式部署,但它通常是动态库的平台等价物。或者,由 agentPath 参数指定的本机库可以与 VM 静态链接。将 agentPath 参数解析为静态链接库名称是在 VM 中以特定于平台的方式完成的。例如,在 UNIX 中,
/a/b/libL.so的 agentPath 参数会将库命名为“L”。有关详细信息,请参阅 JVM TI 规范。此方法导致将给定的代理库加载到目标 VM 中(如果尚未加载或未静态链接到 VM 中)。然后,它会导致目标 VM 调用Agent_OnAttach函数,或者对于名为“L”的静态链接代理,调用 JVM 工具接口 规范中指定的Agent_OnAttach_L函数。请注意,即使在调用此方法之前加载了代理库,也会调用Agent_OnAttach[_L]函数。提供的代理库是加载代理库的绝对路径。与
loadAgentLibrary不同,库名称不会在目标虚拟机中扩展。如果代理库中的
Agent_OnAttach[_L]函数返回错误,则会抛出AgentInitializationException。然后可以通过对异常调用returnValue方法来获取Agent_OnAttach[_L]的返回值。- 参数:
agentPath- 代理库的完整路径。options- 提供给Agent_OnAttach[_L]函数的选项(可以是null)。- 抛出:
AgentLoadException- 如果代理库不存在,则代理库未静态链接到 VM,或者由于其他原因无法加载代理库。AgentInitializationException- 如果Agent_OnAttach[_L]函数返回错误。IOException- 如果发生 I/O 错误NullPointerException- 如果agentPath是null。- 参见:
-
loadAgentPath
public void loadAgentPath(String agentPath) throws AgentLoadException , AgentInitializationException , IOException 通过完整路径名加载本机代理库。这个方便的方法就像调用一样:
loadAgentPath(agentLibrary, null);- 参数:
agentPath- 代理库的完整路径。- 抛出:
AgentLoadException- 如果代理库不存在,则代理库未静态链接到 VM,或者由于其他原因无法加载代理库。AgentInitializationException- 如果Agent_OnAttach[_L]函数返回错误。IOException- 如果发生 I/O 错误NullPointerException- 如果agentPath是null。
-
loadAgent
public abstract void loadAgent(String agent, String options) throws AgentLoadException , AgentInitializationException , IOException 加载代理。提供给此方法的代理是目标虚拟机文件系统上 JAR 文件的路径名。该路径被传递到解释它的目标虚拟机。目标虚拟机尝试启动
java.lang.instrument规范指定的代理程序。也就是说,将指定的 JAR 文件添加到(目标虚拟机的)系统类路径,并调用由 JAR 清单中的Agent-Class属性指定的代理类的agentmain方法。此方法在agentmain方法完成时完成。- 参数:
agent- 包含代理的 JAR 文件的路径。options- 提供给代理的agentmain方法的选项(可以是null)。- 抛出:
AgentLoadException- 如果代理不存在,或者无法以java.lang.instrument规范中指定的方式启动。AgentInitializationException- 如果agentmain抛出异常IOException- 如果发生 I/O 错误NullPointerException- 如果agent是null。
-
loadAgent
public void loadAgent(String agent) throws AgentLoadException , AgentInitializationException , IOException 加载代理。这个方便的方法就像调用一样:
loadAgent(agent, null);- 参数:
agent- 包含代理的 JAR 文件的路径。- 抛出:
AgentLoadException- 如果代理不存在,或者无法以java.lang.instrument规范中指定的方式启动。AgentInitializationException- 如果agentmain抛出异常IOException- 如果发生 I/O 错误NullPointerException- 如果agent是null。
-
getSystemProperties
返回目标虚拟机中的当前系统属性。此方法返回目标虚拟机中的系统属性。键或值不是
String的属性将被忽略。该方法大致等同于在目标虚拟机中调用方法System.getProperties,只是不包括键或值不是String的属性。此方法通常用于决定使用
loadAgent或loadAgentLibrary将哪个代理加载到目标虚拟机中。例如,java.home或user.dir属性可能用于创建代理库或 JAR 文件的路径。- 返回:
- 系统属性
- 抛出:
AttachOperationFailedException- 如果目标虚拟机无法完成附加操作。Throwable.getMessage()将给出更具体的错误消息。IOException- 如果发生 I/O 错误,例如通信错误,无法将其识别为指示目标 VM 中操作失败的错误。- 参见:
-
getAgentProperties
返回当前代理属性在目标虚拟机中。目标虚拟机可以代表代理维护一个属性列表。完成此操作的方式、属性的名称以及允许的值类型是特定于实现的。代理属性通常用于存储通信端点和其他代理配置详细信息。例如,调试器代理可能会为其传输地址创建一个代理属性。
此方法返回键和值为
String的代理属性。键或值不是String的属性将被忽略。如果目标虚拟机中没有维护代理属性,则返回一个空属性列表。- 返回:
- 代理属性
- 抛出:
AttachOperationFailedException- 如果目标虚拟机无法完成附加操作。Throwable.getMessage()将给出更具体的错误消息。IOException- 如果发生 I/O 错误,例如通信错误,无法将其识别为指示目标 VM 中操作失败的错误。
-
startManagementAgent
在目标虚拟机中启动 JMX 管理代理。配置属性与启动 JMX 管理代理时在命令行上指定的属性相同。与在命令行上一样,您至少需要指定
com.sun.management.jmxremote.port属性。有关详细信息,请参阅 使用 JMX 技术进行监控和管理 的联机文档。
- 参数:
agentProperties- 包含代理配置属性的 Properties 对象。- 抛出:
AttachOperationFailedException- 如果目标虚拟机无法完成附加操作。Throwable.getMessage()将给出更具体的错误消息。IOException- 如果发生 I/O 错误,例如通信错误,无法将其识别为指示目标 VM 中操作失败的错误。IllegalArgumentException- 如果 agentProperties 中的键或值无效。NullPointerException- 如果 agentProperties 为空。- 自从:
- 1.8
-
startLocalManagementAgent
在目标虚拟机中启动本地 JMX 管理代理。有关详细信息,请参阅 使用 JMX 技术进行监控和管理 的联机文档。
- 返回:
-
本地连接器服务地址的字符串表示形式。该值可以由
JMXServiceURL(String)构造函数解析。 - 抛出:
AttachOperationFailedException- 如果目标虚拟机无法完成附加操作。Throwable.getMessage()将给出更具体的错误消息。IOException- 如果发生 I/O 错误,例如通信错误,无法将其识别为指示目标 VM 中操作失败的错误。- 自从:
- 1.8
-
hashCode
public int hashCode()返回此 VirtualMachine 的哈希码值。哈希码基于 VirtualMachine 的组件,并满足Object.hashCode方法的一般契约。 -
equals
测试此 VirtualMachine 是否与另一个对象相等。如果给定对象不是 VirtualMachine,则此方法返回
false。两个 VirtualMachines 被认为是相等的要求它们都引用相同的提供者,并且它们的identifiers是相等的。此方法满足
Object.equals方法的一般契约。 -
toString
返回VirtualMachine的字符串表示形式。
-