7

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

4

2 回答 2

12

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。

有关更多详细信息,请阅读这篇文章Java 中的内存映射 IO 简介

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

对于小消息,使用 Java NIO 的 SocketChannel 可能会更好,因为接收者可以在收到消息时得到通知。共享内存只有在发送大消息时才会真正有帮助。

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

于 2009-05-01T06:18:09.347 回答
2

我建议你看看兵马俑。我不知道它是否符合您的要求,因为 Terracotta 的主要目标是无缝可扩展性(“api”只是内存访问),但它肯定有消息集成模块。它是开源的。

干杯。

于 2009-05-01T05:50:54.713 回答