- java.lang.Object
-
- com.sun.tools.attach.VirtualMachine
-
public abstract class VirtualMachine extends Object
Java虚拟机。A
VirtualMachine
表示此Java虚拟机已附加到的Java虚拟机。 它所连接的Java虚拟机有时称为目标虚拟机或目标虚拟机 。 应用程序(通常是一个诸如managemet控制台或分析器之类的工具)使用VirtualMachine将代理加载到目标VM中。 例如,用Java语言编写的概要分析工具可能会附加到正在运行的应用程序,并加载其分析器代理程序来配置正在运行的应用程序。通过使用标识目标虚拟机的标识符调用
attach
方法获得VirtualMachine。 标识符是依赖于实现的,但通常是每个Java虚拟机在其自己的操作系统进程中运行的环境中的进程标识符(或pid)。 可替代地,一个VirtualMachine
实例是通过调用得到attach
方法与VirtualMachineDescriptor
从由返回的虚拟机描述符列表得到list
方法。 一旦获得对虚拟机的引用 ,就使用loadAgent
,loadAgentLibrary
和loadAgentPath
方法将代理加载到目标虚拟机中。loadAgent
方法用于加载以Java语言编写并部署在JAR file
中的代理 。 (有关这些代理如何加载和启动的详细说明,请参阅java.lang.instrument
)。loadAgentLibrary
和loadAgentPath
方法用于加载部署在动态库中或静态链接到VM中的代理 ,并使用JVM Tools Interface 。除了加载代理之外,VirtualMachine还提供对目标VM中的
system properties
的读取访问。 这可以在如属性一些环境中是有用的java.home
,os.name
,或os.arch
被用于构建将被装载到目标虚拟机的路径剂。以下示例演示如何使用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
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
VirtualMachine(AttachProvider provider, String id)
初始化此类的新实例。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 static VirtualMachine
attach(VirtualMachineDescriptor vmd)
附加到Java虚拟机。static VirtualMachine
attach(String id)
附加到Java虚拟机。abstract void
detach()
脱离虚拟机。boolean
equals(Object ob)
测试此VirtualMachine与另一个对象的相等性。abstract Properties
getAgentProperties()
返回目标虚拟机中的当前 代理属性 。abstract Properties
getSystemProperties()
返回目标虚拟机中的当前系统属性。int
hashCode()
返回此VirtualMachine的哈希码值。String
id()
返回此Java虚拟机的标识符。static List<VirtualMachineDescriptor>
list()
返回Java虚拟机的列表。void
loadAgent(String agent)
加载代理abstract void
loadAgent(String agent, String options)
加载代理void
loadAgentLibrary(String agentLibrary)
加载代理库。abstract void
loadAgentLibrary(String agentLibrary, String options)
加载代理库。void
loadAgentPath(String agentPath)
以完整路径名加载本地代理库。abstract void
loadAgentPath(String agentPath, String options)
以完整路径名加载本地代理库。AttachProvider
provider()
返回创建此虚拟机的提供程序。abstract String
startLocalManagementAgent()
启动目标虚拟机中的本地JMX管理代理。abstract void
startManagementAgent(Properties agentProperties)
启动目标虚拟机中的JMX管理代理。String
toString()
返回VirtualMachine
的字符串表示VirtualMachine
。
-
-
-
构造方法详细信息
-
VirtualMachine
protected VirtualMachine(AttachProvider provider, String id)
初始化此类的新实例。- 参数
-
provider
- 创建此类的附加提供者。 -
id
- 标识Java虚拟机的抽象标识符。 - 异常
-
NullPointerException
- 如果provider
或id
是null
。
-
-
方法详细信息
-
list
public static List<VirtualMachineDescriptor> list()
返回Java虚拟机的列表。此方法返回一个Java
VirtualMachineDescriptor
元素的列表。 该列表是通过调用所有安装的listVirtualMachines
方法获得的虚拟机描述符列表的聚合attach providers
。 如果任何提供者都没有知道Java虚拟机,则返回一个空列表。- 结果
- 虚拟机描述符列表。
-
attach
public static VirtualMachine attach(String id) throws AttachNotSupportedException, IOException
附加到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
public abstract void detach() throws IOException
脱离虚拟机。从虚拟机分离后,任何进一步尝试调用该虚拟机的操作将导致抛出
IOException
。 如果在调用此方法时正在进行操作(例如loadAgent
),那么行为是依赖于实现的。 换句话说,如果操作完成或抛出IOException
,则它是实现特定的。如果已经从虚拟机分离,则调用此方法将不起作用。
- 异常
-
IOException
- 如果发生I / O错误
-
provider
public final AttachProvider provider()
返回创建此虚拟机的提供程序。- 结果
- 创建此虚拟机的提供程序。
-
id
public final String id()
返回此Java虚拟机的标识符。- 结果
- 此Java虚拟机的标识符。
-
loadAgentLibrary
public abstract void loadAgentLibrary(String agentLibrary, String options) throws AgentLoadException, AgentInitializationException, IOException
加载代理库。A JVM TI客户端称为代理 。 它是用母语开发的。 JVM TI代理以平台特定的方式部署,但通常是与动态库相当的平台。 或者,它可以静态链接到VM中。 此方法将使给定的代理库加载到目标VM(如果尚未加载或未静态链接到VM中)。 然后它使目标VM调用
Agent_OnAttach
函数,或者对于名为“L”的静态链接代理,Agent_OnAttach_L
函数,如JVM Tools Interface规范中所指定。 请注意,即使在调用此方法之前加载了代理程序库,也会调用Agent_OnAttach[_L]
函数。提供的代理库是代理程序库的名称。 它在目标虚拟机中以实现相关的方式进行解释。 通常,实现将库名称扩展为操作系统特定的文件名。 例如,在UNIX系统上,可以将名称
L
扩展为libL.so
,并使用由LD_LIBRARY_PATH
环境变量指定的搜索路径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
。 - 另请参见:
-
AgentInitializationException.returnValue()
-
loadAgentLibrary
public void loadAgentLibrary(String agentLibrary) throws AgentLoadException, AgentInitializationException, IOException
- 参数
-
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
以完整路径名加载本地代理库。A JVM TI客户端称为代理 。 它是用母语开发的。 JVM TI代理以平台特定的方式部署,但通常是与动态库相当的平台。 或者,由agentPath参数指定的本地库可能与VM静态链接。 将agentPath参数解析为静态链接库名称是以平台特定的方式在VM中完成的。 例如,在UNIX中,agentPath参数为
/a/b/libL.so
将命名库“L”。 有关更多详细信息,请参阅JVM TI规范。 此方法将使给定的代理库加载到目标VM(如果尚未加载或未静态链接到VM中)。 然后,它使目标VM调用Agent_OnAttach
函数,或者对于名为“L”的静态链接代理, 270456492219728规范中指定的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
。 - 另请参见:
-
AgentInitializationException.returnValue()
-
loadAgentPath
public void loadAgentPath(String agentPath) throws AgentLoadException, AgentInitializationException, IOException
- 参数
-
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
方法完成时,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
- 参数
-
agent
- 包含代理的JAR文件的路径。 - 异常
-
AgentLoadException
- 如果代理不存在或不能按照java.lang.instrument
规范中指定的方式启动。 -
AgentInitializationException
- 如果agentmain
抛出异常 -
IOException
- 如果发生I / O错误 -
NullPointerException
- 如果agent
是null
。
-
getSystemProperties
public abstract Properties getSystemProperties() throws IOException
返回目标虚拟机中的当前系统属性。此方法返回目标虚拟机中的系统属性。 键或值不是
String
被省略。 该方法大致等同于目标虚拟机中方法System.getProperties
的调用,但不包括具有不是String
的键或值的属性。该方法通常用于决定使用
loadAgent
或loadAgentLibrary
加载到目标虚拟机中的代理 。 例如,java.home
或user.dir
属性可能用于创建代理库或JAR文件的路径。- 结果
- 系统属性
- 异常
-
AttachOperationFailedException
- 如果目标虚拟机无法完成附加操作。 更具体的错误信息将由Throwable.getMessage()
给出。 -
IOException
- 如果发生I / O错误,例如,通信错误,无法标识为错误,以指示目标VM中的操作失败。 - 另请参见:
-
System.getProperties()
,loadAgentLibrary(java.lang.String, java.lang.String)
,loadAgent(java.lang.String, java.lang.String)
-
getAgentProperties
public abstract Properties getAgentProperties() throws IOException
返回目标虚拟机中的当前代理属性 。目标虚拟机可以代理代理维护属性列表。 这样做的方式,属性的名称和允许的值的类型是具体的实现。 代理属性通常用于存储通信端点和其他代理配置详细信息。 例如,调试器代理可能为其传输地址创建代理属性。
此方法返回代码属性,其键值为
String
。 键或值不是String
被省略。 如果目标虚拟机中没有维护代理属性,则返回空属性列表。- 结果
- 代理属性
- 异常
-
AttachOperationFailedException
- 如果目标虚拟机无法完成附加操作。 更具体的错误信息将由Throwable.getMessage()
给出。 -
IOException
- 如果发生I / O错误,则会发生通信错误,例如无法将其识别为错误,以指示目标VM中的操作失败。
-
startManagementAgent
public abstract void startManagementAgent(Properties agentProperties) throws IOException
启动目标虚拟机中的JMX管理代理。配置属性与启动JMX管理代理时在命令行中指定的属性相同。 以与命令行相同的方式,您至少需要指定
com.sun.management.jmxremote.port
属性。有关详细信息,请参阅Monitoring and Management Using JMX Technology的在线文档。
- 参数
-
agentProperties
- 包含代理配置属性的Properties对象。 - 异常
-
AttachOperationFailedException
- 如果目标虚拟机无法完成附加操作。 更具体的错误信息将由Throwable.getMessage()
给出。 -
IOException
- 如果发生I / O错误,例如,无法识别为指示操作在目标VM中失败的错误的通信错误。 -
IllegalArgumentException
- 如果agentProperties中的键或值无效。 -
NullPointerException
- 如果agentProperties为null。 - 从以下版本开始:
- 1.8
-
startLocalManagementAgent
public abstract String startLocalManagementAgent() throws IOException
启动目标虚拟机中的本地JMX管理代理。有关详细信息,请参阅Monitoring and Management Using JMX Technology的在线文档。
- 结果
-
本地连接器服务地址的字符串表示形式。
该值可以由
JMXServiceURL(String)
构造函数解析。 - 异常
-
AttachOperationFailedException
- 如果目标虚拟机无法完成附加操作。 更具体的错误信息将由Throwable.getMessage()
给出。 -
IOException
- 如果发生I / O错误,例如通信错误,无法识别为错误,以指示目标VM中的操作失败。 - 从以下版本开始:
- 1.8
-
hashCode
public int hashCode()
返回此VirtualMachine的哈希码值。 哈希码是基于VirtualMachine的组件,并且符合Object.hashCode
方法的总体合同。- 重写:
-
hashCode
在Object
- 结果
- 该虚拟机的哈希码值
- 另请参见:
-
Object.equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
-
equals
public boolean equals(Object ob)
测试此VirtualMachine与另一个对象的相等性。如果给定的对象不是VirtualMachine,那么此方法返回
false
。 对于两个被认为是相等的VirtualMachines要求他们都引用同一个提供者,而他们的identifiers
是相等的。该方法满足
Object.equals
方法的一般合同。- 重写:
-
equals
在Object
- 参数
-
ob
- 要比较此对象的对象 - 结果
-
true
如果,并且仅当给定的对象是等于该VirtualMachine的VirtualMachine。 - 另请参见:
-
Object.hashCode()
,HashMap
-
-