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

Posted

技术标签:

【中文标题】Java Attach API 使用啥进程间通信机制?【英文标题】:What interprocess communication mechanism is used by the Java Attach API?Java Attach API 使用什么进程间通信机制? 【发布时间】:2015-12-28 12:21:45 【问题描述】:

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

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

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

那么 Java Attach API 的进程间通信如何在每个主流操作系统上工作?即 Windows、Mac OSX 和 Linux。

【问题讨论】:

我相信你在找JPDA。 嗯,我想知道实际的底层操作系统级机制。例如在 linux 上它使用 Unix 套接字吗?它是否使用其他一些内核机制?窗户呢? @ElliottFrisch 感谢您朝正确的方向轻推,我相信我找到了答案docs.oracle.com/javase/8/docs/technotes/guides/jpda/… 【参考方案1】:

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

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

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

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

较早的 Java 版本使用 java.io.tmpdir 甚至是 environemnt 定义的临时目录,但对于以后的版本 /tmp 是硬编码的。

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

这里对此进行了描述: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 命名空间。 你知道这个补丁的状态吗?您能指出与此相关的资源吗? 我的印象是它已经修复了很长一段时间,但这里有一个看起来未解决的错误bugs.openjdk.java.net/browse/JDK-8228343【参考方案2】:

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

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

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

更多详情请关注here。

【讨论】:

以上是关于Java Attach API 使用啥进程间通信机制?的主要内容,如果未能解决你的问题,请参考以下文章

无线信道建模

任务管理器使用啥 API 来转储进程

转GDB attach到一个进程

这张1930年代手绘5m段无线电收发信机电路图揭开一段尘封往事

如何在进程创建的过程中Attach上WinDBG

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )