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

时间:2015-12-28 12:21:46

标签: 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。

2 个答案:

答案 0 :(得分:2)

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

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

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

可以找到更多详细信息here

答案 1 :(得分:0)

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

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

  • 收集目标JVM的pid并创建一个flaffile /tmp/.attach_pid%d
  • 将SIGQUIT发送到目标JVM
  • 在目标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