Spec-Zone.ru › OpenJDK 25

Интерфейс 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. Подключение создаётся, когда 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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/jdk.jdi/com/sun/jdi/VirtualMachineManager.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API