java - jvm间通信

标签 java rpc

<分区>

我正在寻找 Java 中的进程间通信库。我希望在 JVM 之间发送小消息,如果可以的话,我想使用共享内存来实现。

最佳答案

Java NIO 支持内存映射文件。如果多个 JVM 内存映射同一个文件,它们可以将其用作共享内存。

这里是内存映射文件的例子。

try {
int shmSize = 1024;
RandomAccessFile file = new RandomAccessFile("shm.raw","rw");

// inialize file size
if(file.length() < shmSize) {
  byte[] tmp = new byte[shmSize];
  file.write(tmp);
  file.seek(0); // seek back to start of file.
}

// memory-map file.
FileChannel ch = file.getChannel();
MappedByteBuffer shm = ch.map(FileChannel.MapMode.READ_WRITE, 0, shmSize);
ch.close(); // channel not needed anymore.
shm.load(); // force file into physical memory.

// now use the ByteBuffer's get/put/position methods to read/write the shared memory

} catch(Exception e) { e.printStackTrace(); }

在 Linux 上,您可以在基于内存的文件系统/dev/shm/中创建 shm.raw 文件。这将有助于避免任何磁盘 I/O。

有关更多详细信息,请阅读本文 Introduction to Memory-Mapped IO in Java

此外,您仍然需要一种方法来同步对共享内存的读/写操作。写入完整消息后,发送方 JVM 需要向接收方 JVM 发出信号。

使用 Java NIO 的 SocketChannel 可能更适用于小消息,因为在收到消息时可以通知接收者。共享内存仅在发送大消息时真正有用。

对于不同机器上的 JVM 之间的 IPC 尝试 JIPC

关于java - jvm间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/810212/

相关文章:

go - 服务/方法请求格式错误

java - 为什么java RMI不能通过引用获取返回值

java - IBM Bluemix : Watson Q&A service setup

java - 在 jboss 服务器上加载 DLL

java - 提交新任务时取消当前任务的 ExecutorService

java - apache http 客户端请求重定向

java - 计算广度优先搜索中遍历的边数?

java - 如何从 Eclipse RCP 与 'host' Eclipse IDE 进行通信

android - 跨进程通过引用返回一个AIDL接口(interface)实现

go - 如何使用 grpc 方法处理程序解决此问题