Module  jdk.jdi
软件包  com.sun.jdi

Interface VirtualMachine

  • All Superinterfaces:
    Mirror
    All Known Subinterfaces:
    PathSearchingVirtualMachine


    public interface VirtualMachine
    extends Mirror
    用于调试的虚拟机。 更准确地说,代表目标VM的复合状态的mirror 所有其他镜像都与此接口的实例相关联。 通过此接口的实例直接或间接访问所有其他镜像。 此接口直接支持对全局VM属性的访问和VM执行的控制。

    此接口的实例由实例Connector创建。 例如, AttachingConnector附加到目标VM并返回其虚拟机镜像。 连接器通常将通过调用VirtualMachineManager的VirtualMachineManager.createVirtualMachine(Connection) createVirtualMachine(Connection)方法来创建一个VirtualMachine。

    请注意,在接收到VMStartEvent之前,由启动连接器启动的目标虚拟机不能保证稳定。

    VirtualMachineVirtualMachine作为参数的任何方法可能会导致VMDisconnectedException如果目标VM断开连接,并且VMDisconnectEvent已经或可用于从EventQueue读取。

    VirtualMachineVirtualMachine作为参数的任何方法如果目标虚拟机的内存已经用完,可能会抛出VMOutOfMemoryException

    从以下版本开始:
    1.3
    • 字段详细信息

      • TRACE_NONE

        static final int TRACE_NONE
        所有跟踪都被禁用。
        另请参见:
        Constant Field Values
      • TRACE_SENDS

        static final int TRACE_SENDS
        为发送到目标VM的JDWP数据包启用跟踪。
        另请参见:
        Constant Field Values
      • TRACE_RECEIVES

        static final int TRACE_RECEIVES
        从目标VM接收的JDWP数据包启用跟踪。
        另请参见:
        Constant Field Values
      • TRACE_EVENTS

        static final int TRACE_EVENTS
        跟踪启用内部事件处理。
        另请参见:
        Constant Field Values
      • TRACE_REFTYPES

        static final int TRACE_REFTYPES
        跟踪启用了引用类型的内部管理。
        另请参见:
        Constant Field Values
      • TRACE_OBJREFS

        static final int TRACE_OBJREFS
        跟踪启用对象引用的内部管理。
        另请参见:
        Constant Field Values
    • 方法详细信息

      • allModules

        default List<ModuleReference> allModules​()
        返回所有模块。 对于目标VM中的每个模块, ModuleReference将被放置在返回的列表中。

        并非所有目标虚拟机都支持此操作。 使用canGetModuleInfo()确定是否支持该操作。

        实现要求:
        默认实现会抛出 UnsupportedOperationException
        结果
        一个ModuleReference对象的列表,每个镜像目标VM中的一个模块。
        异常
        UnsupportedOperationException - 如果目标虚拟机不支持此操作。
        从以下版本开始:
        9
      • classesByName

        List<ReferenceType> classesByName​(String className)
        返回与给定名称相匹配的加载引用类型。 该名称必须是完全限定的(例如,java.lang.String)。 返回的列表将包含一个ReferenceType为每个类或接口找到与给定的名称。 搜索仅限于加载类; 不尝试加载给定名称的类。

        返回的列表将包括至少准备的参考类型和未定义准备的类型(如数组)。

        参数
        className - 要搜索的类/接口名称
        结果
        一个ReferenceType对象的列表,每个对象以给定的名称镜像目标VM中的类型。
      • allClasses

        List<ReferenceType> allClasses​()
        返回所有加载的类型。 对于目标VM中的每个加载类型, ReferenceType将被放置在返回的列表中。 该列表将包括镜像类,接口和数组类型的ReferenceTypes。

        返回的列表将包括至少准备的参考类型和未定义准备的类型(如数组)。

        结果
        一个ReferenceType对象的列表,每个对象在目标VM中镜像加载类型。
      • redefineClasses

        void redefineClasses​(Map<? extends ReferenceType,byte[]> classToBytes)
        根据提供的定义重新定义所有给定的类。 重新定义的类中的一个方法称为“等价”(对于旧版本的方法)if
        • 它们的字节码是相同的,除了指向恒定池,而
        • 引用的常数是相等的。
        否则,新方法称为“非等价”。 如果重新定义的方法具有活动堆栈帧,则这些活动帧将继续运行该方法的先前版本的字节码。 如果这种方法的新版本是非等效的,那么来自这些活动帧之一的方法称为“过时”,当在这些方法之一上调用时, Method.isObsolete()将返回true。 如果需要重置这样的框架,请使用ThreadReference.popFrames(StackFrame)从堆栈中弹出旧的过时的方法执行。 重新定义的方法的新调用将始终调用新版本。

        除了根据常规JVM语义发生的情况,此函数不会导致任何初始化。 换句话说,重新定义一个类并不会导致它的初始化器被运行。 预先存在的静态变量的值将保持在调用之前。 但是,完全未初始化(新)静态变量将被分配其默认值。

        如果重新定义的类具有实例,则所有这些实例将在调用完成时具有由重新定义的类定义的字段。 预先存在的字段将保留其以前的值。 任何新字段都将具有默认值; 没有运行实例初始值或构造函数。

        线程不需要暂停。

        此功能不会生成任何事件。

        重定义类中的所有断点都将被删除。

        并非所有目标虚拟机都支持此操作。 使用canRedefineClasses()确定是否支持该操作。 使用canAddMethod()来确定重新定义是否可以添加方法。 使用canUnrestrictedlyRedefineClasses()来确定重新定义是否可以更改模式,删除方法,更改类层次结构等。

        参数
        classToBytes - 从ReferenceType到字节数组的映射。 字节表示新的类定义,并且是Java虚拟机类文件格式。
        异常
        UnsupportedOperationException - 如果目标虚拟机不支持此操作。
        • 如果canRedefineClasses()为false,则此方法的任何调用都将抛出此异常。
        • 如果canAddMethod()是假的,尝试添加一个方法会抛出这个异常。
        • 如果canUnrestrictedlyRedefineClasses()为false,则尝试以下任何操作将抛出此异常
          • 改变模式(字段)
          • 改变层次结构(子类,接口)
          • 删除方法
          • 改变类修饰符
          • 改变方法修饰符
        NoClassDefFoundError - 如果字节不对应于引用类型(名称不匹配)。
        VerifyError - 如果“验证者”检测到一个类虽然形成良好,却包含内部不一致或安全问题。
        ClassFormatError - 如果字节不表示有效的类。
        ClassCircularityError - 如果在初始化类时检测到圆度。
        UnsupportedClassVersionError - 如果虚拟机不支持以字节为单位的主要和次要版本号。
        VMCannotBeModifiedException - 如果VirtualMachine是只读的,请参阅 canBeModified()
        从以下版本开始:
        1.4
        另请参见:
        Method.isObsolete()ThreadReference.popFrames(com.sun.jdi.StackFrame)canRedefineClasses()canAddMethod()canUnrestrictedlyRedefineClasses()
      • allThreads

        List<ThreadReference> allThreads​()
        返回当前正在运行的线程的列表。 对于目标VM中的每个正在运行的线程,将镜像它的ThreadReference放在列表中。 返回的列表包含通过java.lang.Thread创建的线程,通过JNI附加到目标VM的所有本机线程以及目标VM创建的系统线程。 尚未启动的线程对象(参见Thread.start() )和完成执行的线程对象不包括在返回的列表中。
        结果
        一个ThreadReference对象的列表,一个用于镜像VM中的每个正在运行的线程。
      • topLevelThreadGroups

        List<ThreadGroupReference> topLevelThreadGroups​()
        返回没有父级的每个线程组。 对于每个顶级线程组, ThreadGroupReference被放置在返回的列表中。

        该命令可以用作构建现有线程组的树(或树)的第一步。

        结果
        一个ThreadGroupReference对象的列表,每个顶级线程组一个。
      • mirrorOf

        BooleanValue mirrorOf​(boolean value)
        为给定值创建一个BooleanValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 为其创建值的布尔值
        结果
        给定的布尔值为BooleanValue
      • mirrorOf

        ByteValue mirrorOf​(byte value)
        为给定值创建一个ByteValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 用于创建值的字节
        结果
        给定字节的ByteValue
      • mirrorOf

        CharValue mirrorOf​(char value)
        为给定值创建一个CharValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 为其创建值的char
        结果
        给定的char的CharValue
      • mirrorOf

        ShortValue mirrorOf​(short value)
        为给定值创建一个ShortValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 创建价值的简称
        结果
        ShortValue为给定的短。
      • mirrorOf

        IntegerValue mirrorOf​(int value)
        为给定值创建一个IntegerValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 为其创建值的int
        结果
        给定的int为IntegerValue
      • mirrorOf

        LongValue mirrorOf​(long value)
        为给定值创建一个LongValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 一个长期为它创建的价值
        结果
        LongValue为给定的长。
      • mirrorOf

        FloatValue mirrorOf​(float value)
        为给定值创建一个FloatValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 为其创建值的浮点数
        结果
        给定浮动的FloatValue
      • mirrorOf

        DoubleValue mirrorOf​(double value)
        为给定值创建一个DoubleValue 该值可用于设置和比较从该虚拟机中的变量或字段检索的值。
        参数
        value - 创建该值的双倍
        结果
        给予双倍的DoubleValue
      • mirrorOf

        StringReference mirrorOf​(String value)
        在此虚拟机中创建一个字符串。 创建的字符串可用于设置和比较从该虚拟机中的变量或字段检索的字符串值。
        参数
        value - 要创建的字符串
        结果
        一个StringReference镜像目标虚拟机中新创建的字符串。
        异常
        VMCannotBeModifiedException - 如果VirtualMachine是只读的,请参阅 canBeModified()
      • dispose

        void dispose​()
        使此虚拟机镜像无效。 目标VM的通信通道关闭,目标VM准备接受来自此调试器或其他调试器的另一个后续连接,包括以下任务: 在目标虚拟机中执行的任何当前方法调用在断开连接后都会继续。 完成任何此类方法调用后,调用的线程将从最初停止的位置继续。

        源自此VirtualMachine(ObjectReferences,ReferenceTypes等)的资源将无效。

      • exit

        void exit​(int exitCode)
        导致镜像的VM以给定的错误代码终止。 与此VirtualMachine关联的所有资源都将被释放。 如果镜像的VM是远程的,那么它的通信通道将被关闭。 源自此VirtualMachine(ObjectReferences,ReferenceTypes等)的资源将无效。

        在镜像VM中运行的线程突然终止。 线程死亡异常不会被抛出,最后块不运行。

        参数
        exitCode - 目标VM的退出代码。 在某些平台上,退出代码可能会被截断,例如降低8位。
        异常
        VMCannotBeModifiedException - 如果VirtualMachine是只读的 - 请参阅 canBeModified()
      • canWatchFieldModification

        boolean canWatchFieldModification​()
        确定目标VM是否支持现场修改的观察点。
        结果
        true如果该功能被支持,否则为 false
      • canWatchFieldAccess

        boolean canWatchFieldAccess​()
        确定目标VM是否支持现场访问的观察点。
        结果
        true如果该功能被支持,否则为 false
      • canGetBytecodes

        boolean canGetBytecodes​()
        确定目标VM是否支持检索方法的字节码。
        结果
        true如果该功能被支持,否则为 false
      • canGetSyntheticAttribute

        boolean canGetSyntheticAttribute​()
        确定目标VM是否支持方法或字段的合成属性的查询。
        结果
        true如果该功能被支持,否则为 false
      • canGetOwnedMonitorInfo

        boolean canGetOwnedMonitorInfo​()
        确定目标VM是否支持线程拥有的监视器的检索。
        结果
        true如果特性被支持, false否则。
      • canGetCurrentContendedMonitor

        boolean canGetCurrentContendedMonitor​()
        确定目标VM是否支持线程正在等待的监视器的检索。
        结果
        true如果特性被支持, false否则。
      • canGetMonitorInfo

        boolean canGetMonitorInfo​()
        确定目标VM是否支持检索对象的监视器信息。
        结果
        true如果该功能被支持,否则为 false
      • canPopFrames

        boolean canPopFrames​()
        确定目标VM是否支持弹出线程堆栈的帧。
        结果
        true如果该功能被支持,否则为 false
        从以下版本开始:
        1.4
        另请参见:
        ThreadReference.popFrames(com.sun.jdi.StackFrame)
      • canGetSourceDebugExtension

        boolean canGetSourceDebugExtension​()
        确定目标VM是否支持获取源调试扩展。
        结果
        true如果该功能被支持,否则为 false
        从以下版本开始:
        1.4
        另请参见:
        ReferenceType.sourceDebugExtension()
      • canUseSourceNameFilters

        boolean canUseSourceNameFilters​()
        确定目标虚拟机是否支持通过源名称过滤类准备事件。 ClassPrepareRequest.addSourceNameFilter(java.lang.String)
        结果
        true如果支持该功能,否则为 false
        从以下版本开始:
        1.6
      • canForceEarlyReturn

        boolean canForceEarlyReturn​()
        确定目标VM是否支持强制早期返回的方法。
        结果
        true如果该功能被支持,否则为 false
        从以下版本开始:
        1.6
        另请参见:
        ThreadReference.forceEarlyReturn(Value)
      • canBeModified

        boolean canBeModified​()
        确定目标VM是否是只读VM。 如果在只读VM上调用修改VM状态的方法,则抛出VMCannotBeModifiedException
        结果
        true如果支持该功能,否则为 false
        从以下版本开始:
        1.5
      • canGetMonitorFrameInfo

        boolean canGetMonitorFrameInfo​()
        确定目标VM是否支持获取哪个帧已经获取了监视器。
        结果
        true如果特性被支持, false否则。
        从以下版本开始:
        1.6
        另请参见:
        ThreadReference.ownedMonitorsAndFrames()
      • canGetClassFileVersion

        boolean canGetClassFileVersion​()
        确定目标VM是否支持阅读类文件主要和次要版本。
        结果
        true如果特性被支持, false否则。
        从以下版本开始:
        1.6
        另请参见:
        ReferenceType.majorVersion()ReferenceType.minorVersion()
      • canGetModuleInfo

        default boolean canGetModuleInfo​()
        确定目标VM是否支持获取有关模块的信息。
        实现要求:
        默认实现返回 false
        结果
        true如果特性被支持, false否则
        从以下版本开始:
        9
        另请参见:
        allModules()ReferenceType.module()ModuleReference
      • setDefaultStratum

        void setDefaultStratum​(String stratum)
        设置此VM的默认层次(有关层次的讨论,请参阅Location )。 覆盖类文件中的每类默认设置。

        影响位置查询(例如, Location.sourceName() )和单步执行中使用的行边界。

        参数
        stratum - 要设置为VM默认值的层次,或者使用默认值为null。
        异常
        UnsupportedOperationException - 如果目标虚拟机不支持此操作。
        从以下版本开始:
        1.4
      • instanceCounts

        long[] instanceCounts​(List<? extends ReferenceType> refTypes)
        返回“refTypes”列表中每个ReferenceType的实例数。 只有为垃圾收集目的可达到的实例才会被计数。

        并非所有目标虚拟机都支持此操作。 使用canGetInstanceInfo()来确定是否支持该操作。

        参数
        refTypes - 要获取计数的ReferenceType对象的列表。
        结果
        一个long的数组,包含'refTypes'列表中每个元素的一个元素。 数组的元素i包含“refTypes”列表中位置i的ReferenceType的目标VM中的实例数。 如果“refTypes”列表为空,则返回零长度数组。 如果refTypes中的ReferenceType已经被垃圾回收,则返回零的实例计数。
        异常
        UnsupportedOperationException - 如果目标虚拟机不支持此操作 - 请参阅 canGetInstanceInfo()
        NullPointerException - 如果'refTypes'列表为空。
        从以下版本开始:
        1.6
        另请参见:
        ReferenceType.instances(long)ObjectReference.referringObjects(long)
      • name

        String name​()
        返回由属性 java.vm.name报告的目标VM的名称。
        结果
        目标VM名称。
      • setDebugTraceMode

        void setDebugTraceMode​(int traceFlags)
        跟踪由com.sun.jdi实现执行的活动。 所有跟踪信息都输出到System.err。 给定的跟踪标志用于将输出限制为所需的信息。 给定的标志有效,相应的跟踪将继续下一次调用此方法。

        输出取决于实现,跟踪模式可能会被忽略。

        参数
        traceFlags - 识别要启用的跟踪类型。