Класс VirtualMachine
public abstract class VirtualMachine extends Object
Объект VirtualMachine представляет собой виртуальную машину Java, к которой подключена эта виртуальная машина Java. Виртуальная машина Java, к которой подключена эта виртуальная машина, иногда называется целевой виртуальной машиной или целевой ВМ. Приложение (обычно инструмент, такой как консоль управления или профайлер) использует VirtualMachine для загрузки агента в целевую ВМ. Например, инструмент профайлера, написанный на языке Java, может подключиться к работающему приложению и загрузить его агента профайлера для профилирования работающего приложения.
Объект VirtualMachine получаетсся путём вызова метода attach с идентификатором, определяющим целевую виртуальную машину. Идентификатор зависит от реализации, но обычно является идентификатором процесса (или PID) в средах, где каждая виртуальная машина Java работает в собственном процессе операционной системы. В качестве альтернативы, экземпляр VirtualMachine получаетcя путём вызова метода attach с объектом VirtualMachineDescriptor, полученным из списка описателей виртуальных машин, возвращаемых методом list. После получения ссылки на виртуальную машину, методы loadAgent, loadAgentLibrary и loadAgentPath используются для загрузки агентов в целевую виртуальную машину. Метод loadAgent используется для загрузки агентов, написанных на языке Java и развернутых в JAR file. (См. java.lang.instrument для подробного описания процесса загрузки и запуска этих агентов). Методы loadAgentLibrary и loadAgentPath используются для загрузки агентов, развернутых либо в динамической библиотеке, либо статически связанных с ВМ и использующих интерфейс JVM Tools Interface.
Помимо загрузки агентов, 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 безопасен для использования несколькими потоками одновременно.
- Since:
- 1.6
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static VirtualMachine |
attach |
Подключается к виртуальной машине Java. |
static VirtualMachine |
attach |
Подключается к виртуальной машине Java. |
abstract void |
detach() |
Отсоединяется от виртуальной машины. |
boolean |
equals |
Проверяет равенство этой VirtualMachine с другим объектом. |
abstract Properties |
getAgentProperties() |
Возвращает текущие свойства агента в целевой виртуальной машине. |
abstract Properties |
getSystemProperties() |
Возвращает текущие системные свойства в целевой виртуальной машине. |
int |
hashCode() |
Возвращает хэш-код для этой VirtualMachine. |
final String |
id() |
Возвращает идентификатор этой виртуальной машины Java. |
static List |
list() |
Возвращает список виртуальных машин Java. |
void |
loadAgent |
Загружает агента. |
abstract void |
loadAgent |
Загружает агента. |
void |
loadAgentLibrary |
Загружает библиотеку агента. |
abstract void |
loadAgentLibrary |
Загружает библиотеку агента. |
void |
loadAgentPath |
Загружает библиотеку нативного агента по полному пути. |
abstract void |
loadAgentPath |
Загружает библиотеку нативного агента по полному пути. |
final AttachProvider |
provider() |
Возвращает провайдера, создавшего эту виртуальную машину. |
abstract String |
startLocalManagementAgent() |
Запускает локальный агент управления JMX в целевой виртуальной машине. |
abstract void |
startManagementAgent |
Запускает агент управления JMX в целевой виртуальной машине. |
String |
toString() |
Возвращает строковое представление VirtualMachine. |
Подробное описание конструкторов
VirtualMachine
protected VirtualMachine(AttachProvider provider, String id)
- Параметры:
-
provider- Предоставление подключения, создающее этот класс. -
id- Абстрактный идентификатор, определяющий виртуальную машину Java. - Исключения:
-
NullPointerException- Еслиproviderилиidравноnull.
Подробное описание методов
list
public static List<VirtualMachineDescriptor> list()
Этот метод возвращает список элементов Java VirtualMachineDescriptor. Список представляет собой агрегацию списков описателей виртуальных машин, полученных путем вызова метода listVirtualMachines всех установленных attach providers. Если никакими поставщиками не известны виртуальные машины Java, возвращается пустой список.
- Возвращает:
- Список описателей виртуальных машин.
attach
public static VirtualMachine attach(String id) throws AttachNotSupportedException, IOException
Этот метод получает список поставщиков подключений, вызывая метод AttachProvider.providers(). Затем он перебирает список и поочередно вызывает метод attachVirtualMachine каждого поставщика. Если поставщик успешно подключается, итерация завершается, а созданная поставщиком, который успешно подключился, VirtualMachine возвращается этим методом. Если метод attachVirtualMachine всех поставщиков выбрасывает исключение AttachNotSupportedException, то этот метод также выбрасывает AttachNotSupportedException. Это означает, что AttachNotSupportedException выбрасывается, когда предоставленный этому методу идентификатор недействителен, или идентификатор соответствует виртуальной машине Java, которая не существует, или ни один из поставщиков не может подключиться к ней. Это исключение также выбрасывается, если AttachProvider.providers() возвращает пустой список.
- Параметры:
-
id- Абстрактный идентификатор, определяющий виртуальную машину Java. - Возвращает:
- VirtualMachine, представляющий целевую VM.
- Исключения:
-
SecurityException- Если установлен менеджер безопасности и он отказывается предоставитьAttachPermission("attachVirtualMachine"), или другое разрешение, необходимое для реализации. -
AttachNotSupportedException- Если методattachVirtualmachineвсех установленных поставщиков выбрасываетAttachNotSupportedException, или поставщики не установлены. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- Еслиidравноnull.
attach
public static VirtualMachine attach(VirtualMachineDescriptor vmd) throws AttachNotSupportedException, IOException
Этот метод сначала вызывает метод provider() заданного описателя виртуальной машины для получения поставщика подключения. Затем он вызывает метод attachVirtualMachine поставщика подключения, чтобы подключиться к целевой VM.
- Параметры:
-
vmd- Описатель виртуальной машины. - Возвращает:
- VirtualMachine, представляющий целевую VM.
- Исключения:
-
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.
loadAgentLibrary
public abstract void loadAgentLibrary(String agentLibrary, String options) throws AgentLoadException, AgentInitializationException, IOException
Клиент JVM TI называется агентом. Он разработан на родном языке. Агент JVM TI развертывается платформоспецифичным образом, но обычно это платформенный эквивалент динамической библиотеки. В качестве альтернативы, он может быть статически связан с VM. Этот метод вызывает загрузку указанной библиотеки агента в целевую VM (если она еще не загружена или если она не статически связана с VM). Затем он вызывает функцию Agent_OnAttach целевой VM или функцию Agent_OnAttach_L для статически связанного агента под именем 'L', как указано в спецификации JVM Tools Interface. Обратите внимание, что функция Agent_OnAttach[_L] вызывается даже если библиотека агента была загружена до вызова этого метода.
Предоставляемая библиотека агента — это имя библиотеки агента. Оно интерпретируется целевой виртуальной машиной по зависимости от реализации. Обычно реализация преобразует имя библиотеки в имя файла, специфичное для операционной системы. Например, в системах UNIX имя L может быть преобразовано в libL.so, и найдено, используя путь поиска, заданный переменной среды LD_LIBRARY_PATH. Если агент под именем 'L' статически связан с VM, то VM должна экспортировать функцию под именем Agent_OnAttach_L.
Если функция Agent_OnAttach[_L] в библиотеке агента возвращает ошибку, то выбрасывается исключение AgentInitializationException. Значение возврата из Agent_OnAttach[_L] можно получить, вызвав метод returnValue на исключении.
- Параметры:
-
agentLibrary- Название библиотеки агента. -
options- Параметры, которые нужно передать функцииAgent_OnAttach[_L](могут бытьnull). - Исключения:
-
AgentLoadException- Если библиотека агента не существует, библиотека агента не статически связана с VM, или библиотека агента не может быть загружена по другой причине. -
AgentInitializationException- Если функцияAgent_OnAttach[_L]возвращает ошибку. -
IOException- Если произошла ошибка ввода-вывода -
NullPointerException- ЕслиagentLibraryравноnull. - См. также:
loadAgentLibrary
public void loadAgentLibrary(String agentLibrary) throws AgentLoadException, AgentInitializationException, IOException
Этот метод-удобство работает так, как будто вызывается:
loadAgentLibrary(agentLibrary, null);
- Параметры:
-
agentLibrary- Название библиотеки агента. - Исключения:
-
AgentLoadException- Если библиотека агента не существует, библиотека агента не статически связана с VM, или библиотека агента не может быть загружена по другой причине. -
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. Обратите внимание, что функция 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. - См. также:
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- Если произошла ошибка ввода-вывода, ошибка связи и т.п., которую нельзя идентифицировать как ошибку, чтобы указать, что операция завершилась неудачно в целевой виртуальной машине. - См. также:
getAgentProperties
public abstract Properties getAgentProperties() throws IOException
Целевая виртуальная машина может поддерживать список свойств от имени агентов. Способ, имена свойств и допустимые типы значений зависят от реализации. Свойства агента обычно используются для хранения точек подключения, и других данных конфигурации агента. Например, агент отладчика может создать свойство агента для адреса своего транспорта.
Этот метод возвращает свойства агента, у которых ключ и значение являются String. Свойства, у которых ключ или значение не являются String, опускаются. Если в целевой виртуальной машине не сохраняются свойства агента, возвращается пустой список свойств.
- Возвращает:
- Свойства агента
- Исключения:
-
AttachOperationFailedException- Если целевая виртуальная машина не может завершить операцию подключения. Более подробное сообщение об ошибке будет предоставлено методомThrowable.getMessage(). -
IOException- Если произошла ошибка ввода-вывода, ошибка связи и т.п., которую нельзя идентифицировать как ошибку, чтобы указать, что операция завершилась неудачно в целевой виртуальной машине.
startManagementAgent
public abstract void startManagementAgent(Properties agentProperties) throws IOException
Свойства конфигурации такие же, как те, которые задаются в командной строке при запуске агента управления 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 для получения дополнительных сведений.
- Возвращает:
- Строковое представление адреса службы локального коннектора. Значение может быть обработано конструктором
JMXServiceURL(String). - Выбрасывает:
-
AttachOperationFailedException- Если целевая виртуальная машина не может завершить операцию подключения. Более подробное сообщение об ошибке будет выдано методомThrowable.getMessage(). -
IOException- Если произошла ошибка ввода-вывода, например, ошибка связи, которую нельзя идентифицировать как ошибку, указывающую на то, что операция завершилась неудачно в целевой ВМ. - С:
- 1.8
hashCode
public int hashCode()
Object.hashCode.- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- Значение хеш-кода для этой виртуальной машины
- См. также:
equals
public boolean equals(Object ob)
Если данный объект не является VirtualMachine, то этот метод возвращает false. Для того, чтобы две VirtualMachine считались равными, необходимо, чтобы они оба ссылались на один и тот же поставщик, и их identifiers были равны.
Этот метод удовлетворяет общему контракту метода Object.equals.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
ob- Объект, с которым должен быть сравнен этот объект - Возвращает:
-
trueтогда и только тогда, когда данный объект является VirtualMachine, равным этому VirtualMachine. - См. также:
toString
public String toString()
VirtualMachine.- Переопределяет:
-
toStringв классеObject - Возвращает:
- строковое представление объекта.
© 1993, 2023, 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/21/docs/api/jdk.attach/com/sun/tools/attach/VirtualMachine.html