我正在寻找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.
有关更多详细信息,请阅读本文Java中的内存映射IO简介
此外,您仍然需要一种方法来同步读取/写入共享内存.发送完整消息后,发送方JVM将需要向接收方JVM发送信号.
使用Java NIO的SocketChannel可能对小消息更好,因为接收消息时可以通知接收方.共享内存只会在发送大邮件时提供帮助.
对于不同机器上的JVM之间的IPC,请尝试使用 JIPC