Класс VirtualMachine
- java.lang.Object
-
- com.sun.tools.attach.VirtualMachine
public abstract class VirtualMachine extends Object
Виртуальная машина Java.
Объект VirtualMachine представляет виртуальную машину Java, к которой присоединена данная виртуальная машина Java. Виртуальная машина Java, к которой она присоединена, иногда называется целевой виртуальной машиной или целевой ВМ. Приложение (как правило, инструмент, например, консоль управления или профайлер) использует VirtualMachine для загрузки агента в целевую ВМ. Например, инструмент профайлера, написанный на языке Java, может присоединиться к работающему приложению и загрузить свой агент профайлера для профилирования работающего приложения.
Объект VirtualMachine получается путем вызова метода attach с идентификатором, который идентифицирует целевую виртуальную машину. Идентификатор зависит от реализации, но обычно представляет собой идентификатор процесса (или PID) в средах, где каждая виртуальная машина Java выполняется в собственном процессе операционной системы. В качестве альтернативы, экземпляр VirtualMachine получается путем вызова метода attach с объектом VirtualMachineDescriptor, полученным из списка описателей виртуальных машин, возвращаемых методом list. После получения ссылки на виртуальную машину, методы loadAgent, loadAgentLibrary и loadAgentPath используются для загрузки агентов в целевую виртуальную машину. Метод loadAgent используется для загрузки агентов, написанных на языке Java и развернутых в JAR file. (См. java.lang.instrument для подробного описания того, как эти агенты загружаются и запускаются). Методы loadAgentLibrary и loadAgentPath используются для загрузки агентов, развернутых либо в динамической библиотеке, либо статически связанных с ВМ и использующих интерфейс инструментов JVM.
В дополнение к загрузке агентов, VirtualMachine предоставляет доступ для чтения к 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(); В этом примере мы присоединяемся к виртуальной машине Java, идентифицируемой идентификатором процесса 2177. Затем агент управления JMX запускается в целевом процессе с использованием предоставленных аргументов. Наконец, клиент отсоединяется от целевой ВМ.
VirtualMachine безопасен для использования несколькими одновременными потоками.
- С тех пор:
- 1.6
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | VirtualMachine(AttachProvider provider,
String id) | Инициализирует новый экземпляр этого класса. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
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() | Возвращает строковое представление |
Методы, унаследованные от класса java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait Конструкторы
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. - Возвращает:
- VirtualMachine, представляющий целевую ВМ.
- Исключения:
-
SecurityException- Если установлен менеджер безопасности и он запрещаетAttachPermission("attachVirtualMachine"), или другое разрешение, необходимое реализации. -
AttachNotSupportedException- Если методattachVirtualmachineвсех установленных поставщиков выбрасываетAttachNotSupportedException, или установленных поставщиков нет. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- Еслиidравноnull.
attach
public static VirtualMachine attach(VirtualMachineDescriptor vmd)
throws AttachNotSupportedException,
IOException Подключается к виртуальной машине Java.
Этот метод сначала вызывает метод provider() заданного описателя виртуальной машины, чтобы получить поставщика подключения. Затем он вызывает метод attachVirtualMachine поставщика подключения, чтобы подключиться к целевой ВМ.
- Параметры:
-
vmd- Описание виртуальной машины. - Возвращает:
- VirtualMachine, представляющий целевую ВМ.
- Исключения:
-
SecurityException- Если установлен менеджер безопасности и он запрещаетAttachPermission("attachVirtualMachine"), или другое разрешение, необходимое реализации. -
AttachNotSupportedException- Если методattachVirtualmachineпоставщика подключения выбрасываетAttachNotSupportedException. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- Еслиvmdравноnull.
detach
public abstract void detach()
throws IOException Отсоединение от виртуальной машины.
После отсоединения от виртуальной машины любая попытка вызвать операции на этой виртуальной машине вызовет исключение IOException. Если операция (например, loadAgent) выполняется в момент вызова этого метода, поведение зависит от реализации. То есть, реализация определяет, завершит ли операция работу или выбросит IOException.
Если от виртуальной машины уже отсоединено, вызов этого метода не оказывает никакого эффекта.
- Исключения:
-
IOException- Если произошла ошибка ввода-вывода
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 Загружает библиотеку агента.
Клиент JVM TI называется агентом. Он разрабатывается на языке низкого уровня. Агент JVM TI развертывается платформоспецифичным способом, но обычно является платформоспецифичным эквивалентом динамической библиотеки. В качестве альтернативы, он может быть статически связан с ВМ. Этот метод загружает заданную библиотеку агента в целевую ВМ (если она ещё не загружена или не статически связана с ВМ). Затем он заставляет целевую ВМ вызвать функцию Agent_OnAttach или, для статически связанного агента с именем 'L', функцию Agent_OnAttach_L, как указано в спецификации JVM Tools Interface. Обратите внимание, что функция Agent_OnAttach[_L] вызывается даже если библиотека агента была загружена до вызова этого метода.
Предоставленная библиотека агента — это имя библиотеки агента. Оно интерпретируется в целевой виртуальной машине способом, зависящим от реализации. Обычно реализация преобразует имя библиотеки в имя файла, специфичное для операционной системы. Например, в системах UNIX имя L может быть преобразовано в libL.so, и найдено с использованием пути поиска, указанного переменной среды LD_LIBRARY_PATH. Если агент с именем 'L' статически связан с ВМ, то ВМ должна экспортировать функцию с именем Agent_OnAttach_L.
Если функция Agent_OnAttach[_L] в библиотеке агента возвращает ошибку, выбрасывается исключение AgentInitializationException. Значение возврата из функции Agent_OnAttach[_L] можно получить, вызвав метод returnValue на этом исключении.
- Параметры:
-
agentLibrary- Имя библиотеки агента. -
options- Параметры для функцииAgent_OnAttach[_L](могут бытьnull). - Исключения:
-
AgentLoadException- Если библиотека агента не существует, библиотека агента не статически связана с ВМ или библиотека агента не может быть загружена по другой причине. -
AgentInitializationException- Если функцияAgent_OnAttach[_L]возвращает ошибку. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- ЕслиagentLibraryравноnull. - См. также:
AgentInitializationException.returnValue()
loadAgentLibrary
public void loadAgentLibrary(String agentLibrary)
throws AgentLoadException,
AgentInitializationException,
IOException Загружает библиотеку агента.
Этот вспомогательный метод работает так, как будто он вызывается:
loadAgentLibrary(agentLibrary, null);
- Параметры:
-
agentLibrary- Имя библиотеки агента. - Исключения:
-
AgentLoadException- Если библиотека агента не существует, библиотека агента не статически связана с ВМ или библиотека агента не может быть загружена по другой причине. -
AgentInitializationException- Если функцияAgent_OnAttach[_L]возвращает ошибку. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- ЕслиagentLibraryравноnull.
loadAgentPath
public abstract void loadAgentPath(String agentPath,
String options)
throws AgentLoadException,
AgentInitializationException,
IOException Загрузка библиотеки нативного агента по полному пути.
Клиент JVM TI называется агентом. Он разрабатывается на языке низкого уровня. Агент JVM TI развертывается платформоспецифичным способом, но обычно является платформоспецифичным эквивалентом динамической библиотеки. В качестве альтернативы, нативный модуль, указанный параметром agentPath, может быть статически связан с ВМ. Разбор параметра agentPath в имя статически связанной библиотеки выполняется в ВМ платформоспецифичным способом. Например, в UNIX параметр agentPath /a/b/libL.so назначает библиотеку 'L'. Дополнительные сведения см. в спецификации JVM TI. Этот метод загружает указанную библиотеку агента в целевую ВМ (если она ещё не загружена или не статически связана с ВМ). Затем он заставляет целевую ВМ вызвать функцию Agent_OnAttach или, для статически связанного агента с именем 'L', функцию Agent_OnAttach_L, как указано в спецификации JVM Tools Interface. Обратите внимание, что функция Agent_OnAttach[_L] вызывается даже если библиотека агента была загружена до вызова этого метода.
Предоставленная библиотека агента — это абсолютный путь, откуда загружать библиотеку агента. В отличие от loadAgentLibrary, имя библиотеки не расширяется в целевой виртуальной машине.
Если функция Agent_OnAttach[_L] в библиотеке агента возвращает ошибку, выбрасывается исключение AgentInitializationException. Значение возврата из функции Agent_OnAttach[_L] можно получить, вызвав метод returnValue на этом исключении.
- Параметры:
-
agentPath- Полный путь к библиотеке агента. -
options- Параметры для функцииAgent_OnAttach[_L](могут бытьnull). - Исключения:
-
AgentLoadException- Если библиотека агента не существует, библиотека агента не статически связана с ВМ, или библиотека агента не может быть загружена по другой причине. -
AgentInitializationException- Если функцияAgent_OnAttach[_L]возвращает ошибку. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- ЕслиagentPathравноnull. - См. также:
AgentInitializationException.returnValue()
loadAgentPath
public void loadAgentPath(String agentPath)
throws AgentLoadException,
AgentInitializationException,
IOException Загрузка библиотеки нативного агента по полному пути.
Этот метод удобства работает так, как будто вызывается:
loadAgentPath(agentLibrary, null);
- Параметры:
-
agentPath- Полный путь к библиотеке агента. - Исключения:
-
AgentLoadException- Если библиотека агента не существует, библиотека агента не статически связана с виртуальной машиной или библиотека агента не может быть загружена по другой причине. -
AgentInitializationException- Если функцияAgent_OnAttach[_L]возвращает ошибку. -
IOException- Если произошла ошибка ввода-вывода. -
NullPointerException- ЕслиagentPathравноnull.
loadAgent
public abstract void loadAgent(String agent,
String options)
throws AgentLoadException,
AgentInitializationException,
IOException Загрузка агента.
Агент, предоставленный этому методу, — это имя пути к файлу JAR в файловой системе целевой виртуальной машины. Этот путь передается целевой виртуальной машине, где он интерпретируется. Целевая виртуальная машина пытается запустить агента, как указано в спецификации java.lang.instrument. То есть указанный файл JAR добавляется в системный путь к классам (целевой виртуальной машины), и вызывается метод agentmain класса агента, указанный атрибутом Agent-Class в манифесте JAR. Этот метод завершается, когда завершается метод agentmain.
- Параметры:
-
agent- Путь к файлу JAR, содержащему агента. -
options- Опции для предоставления методуagentmainагента (могут бытьnull). - Исключения:
-
AgentLoadException- Если агента не существует или он не может быть запущен указанным образом в спецификацииjava.lang.instrument. -
AgentInitializationException- Еслиagentmainвызывает исключение. -
IOException- Если произошла ошибка ввода-вывода. -
NullPointerException- Еслиagentравноnull.
loadAgent
public void loadAgent(String agent)
throws AgentLoadException,
AgentInitializationException,
IOException Загрузка агента.
Этот метод удобства работает так, как будто вызывается:
loadAgent(agent, null);
- Параметры:
-
agent- Путь к файлу JAR, содержащему агента. - Исключения:
-
AgentLoadException- Если агента не существует или он не может быть запущен указанным образом в спецификацииjava.lang.instrument. -
AgentInitializationException- Еслиagentmainвызывает исключение. -
IOException- Если произошла ошибка ввода-вывода. -
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- Если произошла ошибка ввода-вывода или ошибка связи, например, которая не может быть идентифицирована как ошибка для указания того, что операция завершилась неудачно в целевой виртуальной машине. - См. также:
-
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- Если произошла ошибка ввода-вывода или ошибка связи, например, которая не может быть идентифицирована как ошибка для указания того, что операция завершилась неудачно в целевой виртуальной машине.
startManagementAgent
public abstract void startManagementAgent(Properties agentProperties)
throws IOException Запускает агент управления JMX в целевой виртуальной машине.
Свойства конфигурации такие же, как указанные в командной строке при запуске агента управления JMX. Также, как и в командной строке, вам необходимо указать как минимум свойство com.sun.management.jmxremote.port.
Дополнительные сведения см. в онлайн-документации Мониторинг и управление с помощью технологии JMX.
- Параметры:
-
agentProperties- Объект Properties, содержащий свойства конфигурации для агента. - Исключения:
-
AttachOperationFailedException- Если целевая виртуальная машина не может выполнить операцию присоединения. Более конкретное сообщение об ошибке будет предоставлено методомThrowable.getMessage(). -
IOException- Если произошла ошибка ввода-вывода или ошибка связи, например, которая не может быть идентифицирована как ошибка для указания того, что операция завершилась неудачно в целевой виртуальной машине. -
IllegalArgumentException- Если ключи или значения в agentProperties неверны. -
NullPointerException- Если agentProperties равно null. - Начиная с:
- 1.8
startLocalManagementAgent
public abstract String startLocalManagementAgent()
throws IOException Запускает локальный агент управления JMX в целевой виртуальной машине.
Дополнительные сведения см. в онлайн-документации Мониторинг и управление с помощью технологии JMX.
- Возвращает:
- Строковое представление адреса службы локального соединителя. Значение может быть обработано конструктором
JMXServiceURL(String). - Исключения:
-
AttachOperationFailedException- Если целевая виртуальная машина не может выполнить операцию присоединения. Более конкретное сообщение об ошибке будет предоставлено методомThrowable.getMessage(). -
IOException- Если произошла ошибка ввода-вывода или ошибка связи, например, которая не может быть идентифицирована как ошибка для указания того, что операция завершилась неудачно в целевой виртуальной машине. - Начиная с:
- 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. Для того чтобы две VirtualMachine считались равными, необходимо, чтобы они обе ссылались на одного и того же поставщика и их identifiers были равны.
Этот метод удовлетворяет общему контракту метода Object.equals.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
ob- Объект, с которым должен быть сравнен этот объект - Возвращает:
-
trueтогда и только тогда, когда данный объект является VirtualMachine, равным этому VirtualMachine. - См. также:
-
Object.hashCode(),HashMap
toString
public String toString()
Возвращает строковое представление VirtualMachine.
© 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.attach/com/sun/tools/attach/VirtualMachine.html