Определите текущую JVM с помощью Java или JVMTI

Я хотел бы определить текущую JVM, которая работает. В лучшем случае с функцией, описанной в документации JVMTI, но я ничего не могу найти.


Что я имел в виду, это что-то вроде этого: VirtualMachine.list() обеспечивает:

[sun.tools.attach.WindowsAttachProvider@46ae506e: 2440 de.fu.profiler.view.MainFrame...

Но он отображает все JVM, а не текущую.

5 ответов

Решение

Вы можете получить уникальное имя из RuntimeMXBean. на большинстве платформ это включает processid текущего процесса.

Используйте системные свойства Java, например

java.runtime.name=Java(TM) 2 Runtime Environment, Standard Edition
java.runtime.version=1.5.0_01-b08
java.specification.name=Java Platform API Specification
java.specification.vendor=Sun Microsystems Inc.
java.specification.version=1.5
java.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi
java.version=1.5.0_01
java.vm.info=mixed mode, sharing
java.vm.name=Java HotSpot(TM) Client VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=Sun Microsystems Inc.
java.vm.version=1.5.0_01-b08

использование java.lang.System.getProperties() или же getProperty(String name)

jps (инструмент командной строки в комплекте с JDK) выведет список запущенных в данный момент процессов Java.

Вы можете использовать JMX для поиска и подключения к различным запущенным процессам Java.

http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html

Вам нужно будет включить мониторинг.

Поиск вашего текущего PID очень зависит от операционной системы. Вот сообщение в блоге с еще некоторыми предложениями:

http://blog.igorminar.com/2007/03/how-java-application-can-discover-its.html

Вот ссылки с дополнительной информацией:

Как Java-программа может получить свой собственный идентификатор процесса? http://www.google.com/search?q=find+current+java+process+id

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

Если вы используете JVMTI, вы можете определить потоки, которые работают в JVM, к которой вы подключены. Может быть один или несколько потоков, в зависимости от того, использует ли JVM графический интерфейс или (например) контейнер предприятия. Для заданных потоков вы можете проверить стек и определить текущий вызываемый метод. Если вы выполняете итерацию по стеку, вы можете решить, является ли родительский класс частью JVM (например, java.lang.) Или классом приложения (например, com.fun.). Это может позволить вам однозначно определить "цель" исследуемой JVM.

Будет System.getProperty("java.runtime.name") делать?

Другие вопросы по тегам