Java Attach API使用什么进程间通信机制?

jbx*_*jbx 7 java ipc java-attach-api

我试图找出主要操作系统上Java Attach API使用的进程间通信机制,但我似乎找不到对底层机制的太多引用.

我发现的唯一提及是在这里它指的是由Sun公司开发的,前一段时间的DOORS进程间通信机制 但我怀疑这是在Windows或Mac上使用的.大多数文章描述了Java Attach API以及如何加载共享库/ DLL,但是没有说明jvisualvm和本地JVM进程之间的通信是如何实际工作的.

这里提到tools.jar并且libattach.so(在Unix系统上)或attach.dll(在Windows上)负责支持Attach API,但我找不到很多关于它们如何在内部工作的细节.

那么Java Attach API的进程间通信如何在每个主流操作系统上运行?也就是Windows,Mac OSX和Linux.

eck*_*kes 5

Java Attach API 具有可插入的提供程序架构。动态附加提供程序特定于目标 VM。对于 Oracle 或 OpenJDK JVM,“sun”提供程序负责。此提供程序使用不同的方法,具体取决于操作系统。该协议还支持其他可维护性工具(如jcmd命令)

对于 Linux,它使用以下协议:

  • 收集目标 JVM 的 pid 并创建一个标志文件 /tmp/.attach_pid%d
  • 向目标 JVM 发送 SIGQUIT
  • 在目标 JVM 中,如果标志文件存在,信号处理程序将启动附加侦听器线程
  • 附加侦听器线程将创建一个/tmp/.java_pid%dunix 域套接字并在该套接字上侦听命令
  • 一个典型的命令是load告诉目标 JVM 加载代理实现。这在共享的 attachListener.cpp 中实现并加载 JVMTI 代理。

JMX 使用的方法是“加载”,它加载指定的 JVMTI 代理,然后通过 RMI 定期连接。

较旧的 Java 版本使用 java.io.tmpdir 甚至环境定义的临时目录,但是对于较晚的版本 /tmp 是硬编码的。

在solaris 上使用Door IPC而不是unix 域套接字。在 Windows 上CreateRemoteThread,带有命名管道名称的 a用于此引导。

这在这里描述:http : //openjdk.java.net/groups/hotspot/docs/Serviceability.html#tattach(我没有检查过,但我希望 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

  • 顺便说一句,当受监控的 JVM 位于容器中(不同的 root 和 pid 命名空间)时,上述协议不起作用。目前正在开发一个补丁,使附加客户端使用目标的根目录并解析 PID 命名空间。 (2认同)
  • 我的印象是它已经修复了相当长一段时间,但这里有一个关于它的错误,看起来尚未解决 https://bugs.openjdk.java.net/browse/JDK-8228343 (2认同)

jbx*_*jbx 2

似乎这是在 Java 平台调试器架构( JPDA )之上实现的(正如 Elliott Frisch 所指出的)。

在 Windows 操作系统上,使用共享内存传输。

在基于 Linux 的系统上,使用套接字传输。

更多详情可在这找到。