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



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

Java Attach API具有可插入的提供程序体系结构。动态连接提供程序是特定于目标VM的。在Oracle或OpenJDK JVM的情况下;太阳;供应商负责。此提供程序使用不同的方法,具体取决于操作系统。该协议还支持其他可维护性工具(如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,甚至环境定义的临时目录,但对于较新的版本/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平台调试器体系结构(JPDA)之上实现的(正如Elliott Frisch所指出的)。

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

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

更多详细信息可以在这里找到。

最新更新