我试图找出 Java Attach API 在主要操作系统上使用的进程间通信机制,但我似乎找不到太多关于底层机制的引用。
我发现的唯一提及是 here这里指的是Sun前段时间开发的DOORS进程间通信机制。但我怀疑这是在 Windows 或 Mac 上使用的。大多数文章都描述了 Java Attach API 以及如何加载共享库/DLL,但没有说明 jvisualvm 和本地 JVM 进程之间的通信实际上是如何工作的。
Here提到 tools.jar
和 libattach.so
(在 Unix 系统上)或 attach.dll
(在 Windows 上)负责支持Attach API,但我找不到有关它们内部工作方式的详细信息。
那么 Java Attach API 的进程间通信在各个主流操作系统上是如何工作的呢?即 Windows、Mac OSX 和 Linux。
最佳答案
Java Attach API 具有可插入的提供程序架构。动态附加提供程序特定于目标 VM。在 Oracle 或 OpenJDK JVM 的情况下,“sun”提供者负责。该提供程序使用不同的方法,具体取决于操作系统。该协议(protocol)还支持其他可服务性工具(如 jcmd
命令)
对于 Linux,它使用以下协议(protocol):
- 收集目标 JVM 的 pid 并创建一个标志文件
/tmp/.attach_pid%d
- 向目标 JVM 发送 SIGQUIT
- 在目标 JVM 中,信号处理程序将启动 attach listener thread如果标志文件存在。
- 附加监听器线程将创建一个
/tmp/.java_pid%d
unix 域套接字并在该套接字上监听命令 - 一个典型的命令是
load
,它告诉目标JVM 加载一个代理实现。这在 shared attachListener.cpp 中实现并加载 JVMTI 代理。
JMX 使用的方法是“加载”,加载指定的 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
关于java - Java Attach API 使用什么进程间通信机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493468/