7

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

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

这里提到tools.jarlibattach.so(在 Unix 系统上)或attach.dll(在 Windows 上)负责支持 Attach API,但我找不到关于它们如何在内部工作的详细信息。

那么 Java Attach API 的进程间通信是如何在各个主流操作系统上工作的呢?也就是说,Windows、Mac OSX 和 Linux。

4

2 回答 2

6

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 甚至是 environemnt 定义的临时目录,但是对于更高版本的 /tmp 是硬编码的。

在 solaris 上,使用Door IPC而不是unix 域套接字。在 WindowsCreateRemoteThread上,具有命名管道名称的 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

于 2017-08-23T10:04:19.993 回答
2

似乎这是在 Java Platform Debugger Architecture ( JPDA )之上实现的(正如 Elliott Frisch 所指出的那样)。

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

在基于 Linux 的系统上,使用 Socket 传输。

更多细节可以在这里找到。

于 2015-12-28T12:36:40.207 回答