- 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 描述 protectedVirtualMachine(AttachProvider provider, String id)初始化此类的新实例。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 static VirtualMachineattach(VirtualMachineDescriptor vmd)附加到Java虚拟机。static VirtualMachineattach(String id)附加到Java虚拟机。abstract voiddetach()脱离虚拟机。booleanequals(Object ob)测试此VirtualMachine与另一个对象的相等性。abstract PropertiesgetAgentProperties()返回目标虚拟机中的当前 代理属性 。abstract PropertiesgetSystemProperties()返回目标虚拟机中的当前系统属性。inthashCode()返回此VirtualMachine的哈希码值。Stringid()返回此Java虚拟机的标识符。static List<VirtualMachineDescriptor>list()返回Java虚拟机的列表。voidloadAgent(String agent)加载代理abstract voidloadAgent(String agent, String options)加载代理voidloadAgentLibrary(String agentLibrary)加载代理库。abstract voidloadAgentLibrary(String agentLibrary, String options)加载代理库。voidloadAgentPath(String agentPath)以完整路径名加载本地代理库。abstract voidloadAgentPath(String agentPath, String options)以完整路径名加载本地代理库。AttachProviderprovider()返回创建此虚拟机的提供程序。abstract StringstartLocalManagementAgent()启动目标虚拟机中的本地JMX管理代理。abstract voidstartManagementAgent(Properties agentProperties)启动目标虚拟机中的JMX管理代理。StringtoString()返回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
-
-