Класс VirtualMachine
public abstract class VirtualMachine extends Object
VirtualMachine представляет виртуальную машину Java, к которой подключена эта виртуальная машина Java. Виртуальную машину Java, к которой выполняется подключение, иногда называют целевой виртуальной машиной или целевой VM. Приложение (обычно инструмент, например консоль управления или профилировщик) использует VirtualMachine для загрузки агента в целевую VM. Например, инструмент-профилировщик, написанный на языке Java, может подключиться к работающему приложению и загрузить в него свой агент для профилирования.
Экземпляр VirtualMachine получают вызовом метода attach с идентификатором целевой виртуальной машины. Идентификатор зависит от реализации, но обычно это идентификатор процесса (или pid) в средах, где каждая виртуальная машина Java работает в отдельном процессе операционной системы. В качестве альтернативы экземпляр VirtualMachine получают вызовом метода attach с объектом VirtualMachineDescriptor, полученным из списка дескрипторов виртуальных машин, возвращаемого методом list. После получения ссылки на виртуальную машину для загрузки агентов в целевую виртуальную машину используются методы loadAgent, loadAgentLibrary и loadAgentPath. Метод loadAgent используется для загрузки агентов, написанных на языке Java и развернутых в JAR file. (Подробное описание загрузки и запуска этих агентов см. в разделе java.lang.instrument). Методы loadAgentLibrary и loadAgentPath используются для загрузки агентов, размещенных в динамической библиотеке или статически связанных с VM и использующих интерфейс JVM Tools.
Помимо загрузки агентов, VirtualMachine предоставляет доступ на чтение к system properties в целевой VM. Это может быть полезно в некоторых средах, где такие свойства, как java.home, os.name или os.arch, используются для построения пути к агенту, который будет загружен в целевую VM.
В следующем примере показано использование 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 с переданными аргументами. Наконец, клиент отключается от целевой VM.
VirtualMachine можно безопасно использовать из нескольких потоков одновременно.
- С версии:
- 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, представляющий целевую виртуальную машину.
- Выбрасывает:
-
AttachNotSupportedException— если методattachVirtualmachineвсех установленных поставщиков выбрасываетAttachNotSupportedExceptionили если поставщики не установлены. -
IOException— если происходит ошибка ввода-вывода -
NullPointerException— еслиidравноnull.
attach
public static VirtualMachine attach(VirtualMachineDescriptor vmd) throws AttachNotSupportedException, IOException
Сначала этот метод вызывает метод provider() заданного дескриптора виртуальной машины, чтобы получить поставщика подключения. Затем он вызывает метод attachVirtualMachine этого поставщика для подключения к целевой виртуальной машине.
- Параметры:
-
vmd— дескриптор виртуальной машины. - Возвращает:
- Объект VirtualMachine, представляющий целевую виртуальную машину.
- Выбрасывает:
-
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 зависит от платформы, но обычно он представляет собой эквивалент динамической библиотеки для данной платформы. В качестве альтернативы агент может быть статически связан с виртуальной машиной. Этот метод загружает заданную библиотеку агента в целевую виртуальную машину (если она еще не загружена и не связана с виртуальной машиной статически). Затем он вызывает в целевой виртуальной машине функцию Agent_OnAttach или, для статически связанного агента с именем «L», функцию Agent_OnAttach_L, как указано в спецификации интерфейса JVM Tools. Обратите внимание, что функция 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. - См. также:
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. Обратите внимание, что функция 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.equals
public boolean equals(Object ob)
Если заданный объект не является VirtualMachine, этот метод возвращает false. Два объекта VirtualMachine считаются равными, если они ссылаются на одного и того же поставщика, а их identifiers равны.
Этот метод соответствует общему контракту метода Object.equals.
toString
© 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.attach/com/sun/tools/attach/VirtualMachine.html