Интерфейс VirtualMachineManager

public interface VirtualMachineManager

Менеджер подключений к виртуальным машинам-целям. VirtualMachineManager позволяет одному приложению отлаживать несколько целевых ВМ. (Обратите внимание, что обратное не поддерживается; целевая ВМ может отлаживаться только одним приложением отладчика.) Данный интерфейс содержит методы для управления подключениями к удалённым целевым ВМ и получения зеркала VirtualMachine для доступных целевых ВМ.

Подключения могут быть установлены с использованием одного из нескольких различных объектов Connector. Каждый коннектор описывает отдельный способ подключения отладчика к целевой ВМ.

VirtualMachineManager поддерживает множество различных сценариев подключения отладчика к виртуальной машине. В таблице ниже представлены четыре примера. Примеры используют синтаксис командной строки в реализации Sun. Некоторые реализации Connector могут потребовать немного иного обращения, чем представлено ниже.

Сценарий Описание
Отладчик запускает целевую ВМ (простейший и наиболее распространённый сценарий) Отладчик вызывает метод LaunchingConnector.launch(java.util.Map) по умолчанию коннектора, полученного с помощью defaultConnector(). Целевая ВМ запускается, и устанавливается соединение между этой ВМ и отладчиком. Возвращается зеркало VirtualMachine.

Или, для большего контроля

  • Отладчик выбирает коннектор из списка, возвращаемого launchingConnectors(), с желаемыми характеристиками (например, тип транспорта и т. д.).
  • Отладчик вызывает метод LaunchingConnector.launch(java.util.Map) выбранного коннектора. Целевая ВМ запускается, и устанавливается соединение между этой ВМ и отладчиком. Возвращается зеркало VirtualMachine.
Отладчик присоединяется к ранее запущенной ВМ
  • Целевая ВМ запускается с использованием параметров -agentlib:jdwp=transport=xxx,server=y
  • Целевая ВМ генерирует и выводит адрес, специфичный для транспорта, на котором она будет ожидать подключение.
  • Запускается отладчик. Отладчик выбирает коннектор в списке, возвращаемом attachingConnectors(), соответствующий транспорту с именем "xxx".
  • Отладчик предоставляет параметры коннектора по умолчанию (полученные через Connector.defaultArguments()) конечному пользователю, позволяя пользователю заполнить адрес, специфичный для транспорта, сгенерированный целевой ВМ.
  • Отладчик вызывает метод AttachingConnector.attach(java.util.Map) выбранного коннектора для присоединения к целевой ВМ. Возвращается зеркало VirtualMachine.
Целевая ВМ присоединяется к ранее запущенному отладчику
  • При запуске отладчик выбирает один или несколько коннекторов из списка, возвращаемого listeningConnectors(), для одного или нескольких транспортов.
  • Отладчик вызывает метод ListeningConnector.startListening(java.util.Map) для каждого выбранного коннектора. Для каждого вызова генерируется и возвращается строка адреса, специфичная для транспорта. Отладчик делает имена транспортов и соответствующие строки адресов доступными конечному пользователю.
  • Отладчик вызывает ListeningConnector.accept(java.util.Map) для каждого выбранного коннектора, чтобы ожидать подключения целевой ВМ.
  • Позже, целевая ВМ запускается конечным пользователем с параметрами -agentlib:jdwp=transport=xxx,address=yyy , где "xxx" — транспорт для одного из коннекторов, выбранных отладчиком, а "yyy" — адрес, сгенерированный ListeningConnector.accept(java.util.Map) для этого транспорта.
  • Вызов отладчиком ListeningConnector.accept(java.util.Map) возвращает зеркало VirtualMachine.
Целевая ВМ запускает отладчик (иногда называется "отладкой в реальном времени")
  • Целевая ВМ запускается с параметрами -agentlib:jdwp=launch=cmdline,onuncaught=y,transport=xxx,server=y
  • Позже, в целевой ВМ возникает необработанное исключение. Целевая ВМ генерирует адрес, специфичный для транспорта, на котором она будет ожидать подключения.
  • Целевая ВМ запускает отладчик со следующими элементами, объединёнными вместе (разделенными пробелами), чтобы сформировать командную строку:
    • Значение launch=
    • Значение transport=
    • Сгенерированный адрес, специфичный для транспорта, на котором ВМ ожидает подключение отладчика.
  • При запуске отладчик выбирает коннектор в списке, возвращаемом attachingConnectors(), соответствующий транспорту с именем "xxx".
  • Отладчик изменяет параметры коннектора по умолчанию (полученные через Connector.defaultArguments()), чтобы указать адрес, специфичный для транспорта, на котором ВМ ожидает подключение. При необходимости, могут быть представлены и другие аргументы коннектора пользователю.
  • Отладчик вызывает метод AttachingConnector.attach(java.util.Map) выбранного коннектора для присоединения к целевой ВМ. Возвращается зеркало VirtualMachine.

Коннекторы создаются во время запуска. То есть они создаются в первый раз при вызове Bootstrap.virtualMachineManager(). Список всех коннекторов, созданных во время запуска, можно получить из VirtualMachineManager, вызвав метод allConnectors.

Коннекторы создаются во время запуска, если они установлены на платформе. Кроме того, коннекторы создаются автоматически VirtualMachineManager для инкапсуляции любых реализаций TransportService, установленных на платформе. Два этих механизма создания коннекторов описаны здесь.

Коннектор устанавливается на платформе, если он установлен в файле jar, видимом для определяющего загрузчика класса типа Connector, и этот файл jar содержит файл конфигурации поставщика, названный Connector в каталоге ресурсов META-INF/services, а файл конфигурации поставщика перечисляет полное имя класса реализации коннектора. Коннектор — это класс, реализующий интерфейс Connector. Более точно, класс реализует один из конкретных типов коннекторов, а именно AttachingConnector, ListeningConnector или LaunchingConnector. Формат файла конфигурации поставщика — одно полное имя класса на строке. Пробелы и символы табуляции вокруг каждого класса, а также пустые строки игнорируются. Символ комментария — '#' (0x23), а все символы после первого символа комментария в каждой строке игнорируются. Файл должен быть закодирован в UTF-8.

Во время запуска VirtualMachineManager пытается загрузить и инициализировать (используя конструктор без аргументов) каждый класс, перечисленный в файле конфигурации поставщика. Исключения, возникающие при загрузке или создании коннектора, перехватываются и игнорируются. Другими словами, процесс запуска продолжается независимо от ошибок.

В дополнение к установленным на платформе коннекторам VirtualMachineManager также создаст коннекторы для инкапсуляции любых реализаций TransportService, установленных на платформе. Сервис транспорта устанавливается на платформе, если он установлен в файле jar, который виден определяющему загрузчику класса типа TransportService, и этот файл jar содержит файл конфигурации поставщика, названный TransportService в каталоге ресурсов META-INF/services, и файл конфигурации поставщика перечисляет полное имя класса реализации сервиса транспорта. Сервис транспорта — конкретный подкласс TransportService. Формат файла конфигурации поставщика такой же, как и файл конфигурации поставщика для коннекторов, за исключением того, что каждый перечисленный класс должен быть полным именем класса, реализующего интерфейс TransportService.

Для каждого установленного на платформе сервиса транспорта VirtualMachineManager создаёт соответствующий AttachingConnector и ListeningConnector. Эти коннекторы созданы для инкапсуляции Transport, который в свою очередь инкапсулирует сервис транспорта. Коннектор AttachingConnector будет назван на основе имени сервиса транспорта, к которому добавлена строка Attach. Например, если метод сервиса транспорта name() возвращает telepathic, то коннектор AttachingConnector будет назван telepathicAttach. Аналогично, коннектор ListeningConnector будет назван с добавлением строки Listen к имени сервиса транспорта. Метод description() как AttachingConnector, так и ListeningConnector делегируют метод description() базового сервиса транспорта. У обоих коннекторов AttachingConnector и ListeningConnector есть два аргумента коннектора Arguments. Аргумент коннектора типа StringArgument под названием address — это аргумент коннектора для указания адреса для подключения или прослушивания. Аргумент коннектора типа IntegerArgument под названием timeout — это аргумент коннектора для указания тайм-аута при подключении или приёме. Аргумент тайм-аута может быть проигнорирован в зависимости от того, поддерживает ли сервис транспорта тайм-аут подключения или приёма.

Инициализация менеджера виртуальной машины завершится ошибкой, т. е. Bootstrap.virtualMachineManager() выбросит ошибку, если менеджер виртуальной машины не сможет создать ни одного коннектора.

С момента:
1.3

Методы

Модификатор и тип Метод Описание
List<Connector> allConnectors()

Возвращает список всех известных объектов Connector.

List<AttachingConnector> attachingConnectors()

Возвращает список известных объектов AttachingConnector.

List<VirtualMachine> connectedVirtualMachines()

Выводит список всех целевых виртуальных машин, подключенных к отладчику.

VirtualMachine createVirtualMachine​(Connection connection)

Создаёт новую виртуальную машину.

VirtualMachine createVirtualMachine​(Connection connection, Process process)

Создаёт зеркало виртуальной машины для целевой виртуальной машины.

LaunchingConnector defaultConnector()

Идентифицирует стандартный соединитель.

List<LaunchingConnector> launchingConnectors()

Возвращает список известных объектов LaunchingConnector.

List<ListeningConnector> listeningConnectors()

Возвращает список известных объектов ListeningConnector.

int majorInterfaceVersion()

Возвращает номер основной версии интерфейса JDI.

int minorInterfaceVersion()

Возвращает номер дополнительной версии интерфейса JDI.

Методы

defaultConnector

LaunchingConnector defaultConnector()

Идентифицирует стандартный соединитель. Этот соединитель должен использоваться в качестве запускающего соединителя, когда выбор соединителя со специфическими характеристиками не требуется.

Возвращает:
стандартный LaunchingConnector

launchingConnectors

List<LaunchingConnector> launchingConnectors()

Возвращает список известных объектов LaunchingConnector. Любой из возвращённых объектов может быть использован для запуска новой целевой виртуальной машины и немедленного создания зеркала VirtualMachine для неё. Обратите внимание, что целевая виртуальная машина, запущенная с помощью запускающего соединителя, не гарантируется стабильной до получения события VMStartEvent.

Возвращает:
список объектов LaunchingConnector.

attachingConnectors

List<AttachingConnector> attachingConnectors()

Возвращает список известных объектов AttachingConnector. Любой из возвращённых объектов может быть использован для подключения к существующей целевой виртуальной машине и создания зеркала VirtualMachine для неё.

Возвращает:
список объектов AttachingConnector.

listeningConnectors

List<ListeningConnector> listeningConnectors()

Возвращает список известных объектов ListeningConnector. Любой из возвращённых объектов может быть использован для прослушивания подключения, инициированного целевой виртуальной машиной, и создания зеркала VirtualMachine для неё.

Возвращает:
список объектов ListeningConnector.

allConnectors

List<Connector> allConnectors()

Возвращает список всех известных объектов Connector.

Возвращает:
список объектов Connector.

connectedVirtualMachines

List<VirtualMachine> connectedVirtualMachines()

Выводит список всех целевых виртуальных машин, подключенных к отладчику. Список включает в себя экземпляры VirtualMachine для любых целевых виртуальных машин, которые инициировали подключение, и любых целевых виртуальных машин, к которым этот менеджер инициировал подключение. Целевая виртуальная машина остаётся в этом списке до отключения виртуальной машины. Событие VMDisconnectEvent помещается в очередь событий после удаления виртуальной машины из списка.

Возвращает:
список объектов VirtualMachine , каждое из которых отображает целевую виртуальную машину.

majorInterfaceVersion

int majorInterfaceVersion()

Возвращает номер основной версии интерфейса JDI. См. VirtualMachine.version() для версии и информации о целевой виртуальной машине и VirtualMachine.description() для дополнительной информации о версии.

Возвращает:
целое число - номер основной версии.

minorInterfaceVersion

int minorInterfaceVersion()

Возвращает номер дополнительной версии интерфейса JDI. См. VirtualMachine.version() для версии и информации о целевой виртуальной машине и VirtualMachine.description() для дополнительной информации о версии.

Возвращает:
целое число - номер дополнительной версии

createVirtualMachine

VirtualMachine createVirtualMachine(Connection connection,
                                    Process process)
                             throws IOException

Создаёт зеркало виртуальной машины для целевой виртуальной машины.

Создаёт зеркало виртуальной машины для целевой виртуальной машины, для которой уже существует объект Connection. Объект Connection создаётся, когда Connector устанавливает подключение и успешно выполняет рукопожатие с целевой виртуальной машиной. Затем соединитель может использовать этот метод для создания зеркала виртуальной машины, чтобы представить составное состояние целевой виртуальной машины.

Аргумент process указывает объект Process для целевой виртуальной машины. Он может быть задан как null. Если целевая виртуальная машина запускается LaunchingConnector, то аргумент process должен быть указан, в противном случае вызов VirtualMachine.process() на созданной виртуальной машине вернёт null.

Этот метод существует для того, чтобы соединители могли создавать зеркало виртуальной машины при установлении соединения с целевой виртуальной машиной. Только разработчики, создающие новые реализации соединителей, должны использовать этот метод напрямую.

Параметры:
connection - Открытое подключение к целевой виртуальной машине.
process - Если запущена, объект Process целевой виртуальной машины. null если не запущена.
Возвращает:
новую виртуальную машину, представляющую целевую виртуальную машину.
Исключения:
IOException - если произошла ошибка ввода-вывода
IllegalStateException - если подключение не открыто
С момента:
1.5
См. также:
Connection.isOpen(), VirtualMachine.process()

createVirtualMachine

VirtualMachine createVirtualMachine(Connection connection)
                             throws IOException

Создаёт новую виртуальную машину.

Этот метод действует так, как если бы вызывался метод createVirtualMachine(Connection, Process) и был задан null в качестве аргумента process.

Этот метод существует для того, чтобы соединители могли создавать зеркало виртуальной машины при установлении соединения с целевой виртуальной машиной. Только разработчики, создающие новые реализации соединителей, должны использовать этот метод напрямую.

Возвращает:
новую виртуальную машину
Исключения:
IOException - если произошла ошибка ввода-вывода
IllegalStateException - если подключение не открыто
С момента:
1.5

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/jdk.jdi/com/sun/jdi/VirtualMachineManager.html

Spec-Zone .ru
спецификации, руководства, описания, API