Какой механизм межпроцессного взаимодействия используется 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