Какой механизм межпроцессного взаимодействия используется API Java Attach?

Я пытаюсь выяснить механизм межпроцессного взаимодействия, используемый API Java Attach в основных операционных системах, но я не могу найти много ссылок на базовый механизм.

Единственное упоминание, которое я нашел, было здесь, где оно относится к механизму межпроцессного взаимодействия DOORS, разработанному некоторое время назад Sun. Но я сомневаюсь, что это используется на Windows или Mac. В большинстве статей описывается API Java Attach и как загружаются разделяемые библиотеки / DLL, но не более того, чтобы указать, как на самом деле работает связь между, скажем, jvisualvm и локальным процессом JVM.

Здесь есть упоминание, что tools.jar а также libattach.so (в системах Unix) или attach.dll (в Windows) отвечают за поддержку Attach API, но я не смог найти подробностей о том, как они работают внутри.

Так как же межпроцессное взаимодействие для API Java Attach работает в каждой из основных операционных систем? То есть Windows, Mac OSX и Linux.

2 ответа

Java Attach API имеет подключаемую архитектуру провайдера. Поставщик динамического подключения специфичен для целевой виртуальной машины. В случае Oracle или OpenJDK JVM ответственным является поставщик "sun". Этот провайдер использует разные методы в зависимости от операционной системы. Протокол также поддерживает другие инструменты обслуживания (например, jcmd команд)

Для Linux он использует следующий протокол:

  • собрать pid целевой JVM и создать flaffile /tmp/.attach_pid%d
  • отправить SIGQUIT целевой JVM
  • в целевой JVM обработчик сигнала запустит поток прослушивателя присоединения, если файл флага существует.
  • Поток слушателя присоединения создаст /tmp/.java_pid%d сокет домена unix и слушайте на этом сокете команды
  • типичная команда load который сообщает целевой JVM о загрузке реализации агента. Это включается в общий файл attachListener.cpp и загружает агент JVMTI.

Для JMX используется метод "load", который загружает указанный агент JVMTI, а затем регулярно подключается через RMI.

В старых версиях Java использовался java.io.tmpdir или даже определенные временные каталоги, определенные environemnt, однако для более поздних версий / tmp жестко задан.

На солярисе используется дверной IPC вместо доменного сокета unix. На окнах CreateRemoteThread с именем именованного канала используется для этой начальной загрузки.

Это описано здесь: http://openjdk.java.net/groups/hotspot/docs/Serviceability.html (я не проверял, но я ожидал, что порт HP будет использовать механизм Linux, порт OpenJDK AIX это делает),

Для IBM JDK используется аналогичный механизм (с дополнительной конфигурацией), как описано здесь: https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.0.0/com.ibm.java.win.70.doc/user/attachapi.html

Кажется, это реализовано поверх архитектуры отладчика платформы Java ( JPDA) (как указал Эллиотт Фриш).

В ОС Windows используется транспорт с общей памятью.

В системах на основе Linux используется транспорт Socket.

Более подробную информацию можно найти здесь.

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