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

标签 java ipc java-attach-api

我试图找出 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。

最佳答案

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/

相关文章:

java - JPA 中的 ORM 域对象 ACL

java - Java中隐藏标题栏上的按钮

posix - System V IPC 与 POSIX IPC

c++ - 调用 shmdt() 后无法删除共享内存段

c++ - 如何持续监控消息队列?

java - 转换类没有效果

java - WebSocket 消息代理的 Android 客户端

java - Akka actor重启时重新发送 "init"消息