VirtualMachine
表示一个Java虚拟机,该Java虚拟机已连接到。它连接的Java虚拟机有时被称为目标虚拟机或目标VM。一个应用程序(通常是诸如管理控制台或分析器之类的工具)使用VirtualMachine将代理加载到目标VM中。例如,用Java语言编写的分析器工具可能会附加到运行中的应用程序,并加载其分析器代理以对运行中的应用程序进行分析。
通过使用标识符调用attach
方法获取VirtualMachine,该标识符标识目标虚拟机。标识符是依赖于实现的,但通常在每个Java虚拟机在自己的操作系统进程中运行的环境中是进程标识符(或pid)。另外,通过使用从list
方法返回的虚拟机描述符列表中获取的VirtualMachineDescriptor
调用attach
方法也可以获取VirtualMachine
实例。一旦获取到对虚拟机的引用,就可以使用loadAgent
、loadAgentLibrary
和loadAgentPath
方法将代理加载到目标虚拟机中。使用loadAgent
方法加载用Java语言编写并部署在JAR文件
中的代理。(有关这些代理如何加载和启动的详细说明,请参见java.lang.instrument
)。使用loadAgentLibrary
和loadAgentPath
方法加载部署在动态库或静态链接到VM中并使用JVM工具接口的代理。
除了加载代理,VirtualMachine还提供对目标VM中的系统属性
的读取访问。在某些环境中,这可能很有用,例如使用诸如java.home
、os.name
或os.arch
之类的属性构造将加载到目标VM中的代理的路径。
以下示例演示了如何使用VirtualMachine:
// 附加到目标VM VirtualMachine vm = VirtualMachine.attach("2177"); // 启动管理代理 Properties props = new Properties(); props.put("com.sun.management.jmxremote.port", "5000"); vm.startManagementAgent(props); // 分离 vm.detach();
在此示例中,我们附加到由进程标识符2177
标识的Java虚拟机。然后,在目标进程中使用提供的参数启动JMX管理代理。最后,客户端从目标VM中分离。
VirtualMachine可安全用于多个并发线程。
- 自版本:
- 1.6
-
Constructor Summary
ModifierConstructorDescriptionprotected
VirtualMachine
(AttachProvider provider, String id) 初始化此类的新实例。 -
Method Summary
Modifier and TypeMethodDescriptionstatic VirtualMachine
附加到Java虚拟机。static VirtualMachine
附加到Java虚拟机。abstract void
detach()
从虚拟机分离。boolean
测试此VirtualMachine与另一个对象的相等性。abstract Properties
返回目标虚拟机中当前的代理属性。abstract Properties
返回目标虚拟机中当前的系统属性。int
hashCode()
返回此VirtualMachine的哈希码值。final String
id()
返回此Java虚拟机的标识符。static List
<VirtualMachineDescriptor> list()
返回Java虚拟机的列表。void
加载代理。abstract void
加载代理。void
loadAgentLibrary
(String agentLibrary) 加载代理库。abstract void
loadAgentLibrary
(String agentLibrary, String options) 加载代理库。void
loadAgentPath
(String agentPath) 通过完整路径加载本地代理库。abstract void
loadAgentPath
(String agentPath, String options) 通过完整路径加载本地代理库。final AttachProvider
provider()
返回创建此虚拟机的提供程序。abstract String
在目标虚拟机中启动本地JMX管理代理。abstract void
startManagementAgent
(Properties agentProperties) 在目标虚拟机中启动JMX管理代理。toString()
返回VirtualMachine
的字符串表示形式。
-
Constructor Details
-
VirtualMachine
初始化此类的新实例。- 参数:
-
provider
- 创建此类的附加提供程序。 -
id
- 标识Java虚拟机的抽象标识符。 - 抛出:
-
NullPointerException
- 如果provider
或id
为null
。
-
-
Method Details
-
list
返回Java虚拟机的列表。此方法返回Java
VirtualMachineDescriptor
元素的列表。该列表是通过调用所有已安装的listVirtualMachines
方法获取的虚拟机描述符列表的聚合。如果没有任何提供程序知道任何Java虚拟机,则返回空列表。- 返回:
- 虚拟机描述符的列表。
-
attach
附加到Java虚拟机。此方法通过调用
AttachProvider.providers()
方法获取附加提供程序的列表。然后遍历列表,并依次调用每个提供程序的attachVirtualMachine
方法。如果提供程序成功附加,则迭代终止,并由成功附加的提供程序创建的VirtualMachine由此方法返回。如果所有提供程序的attachVirtualMachine
方法都抛出AttachNotSupportedException
,则此方法也会抛出AttachNotSupportedException
。这意味着当提供给此方法的标识符无效,或标识符对应于不存在的Java虚拟机,或没有提供程序能够附加到它时,将抛出AttachNotSupportedException
。如果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调用JVM工具接口规范中指定的
Agent_OnAttach
函数或对于名为'L'的静态链接代理,调用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静态链接。在VM中,将agentPath参数解析为静态链接库名称是以特定于平台的方式完成的。例如,在UNIX中,
/a/b/libL.so
的agentPath参数将命名一个库'L'。有关更多详细信息,请参阅JVM TI规范。此方法导致给定的代理库加载到目标VM中(如果尚未加载或未静态链接到VM中)。然后,它导致目标VM调用JVM工具接口规范中指定的Agent_OnAttach
函数或对于名为'L'的静态链接代理,调用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
的属性。此方法通常用于决定要加载到目标虚拟机中的代理。例如,
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为null。 - 自:
- 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
。要考虑两个VirtualMachine相等,需要它们都引用相同的提供程序,并且它们的标识符
相等。此方法满足
Object.equals
方法的一般契约。 -
toString
返回VirtualMachine
的字符串表示形式。
-