在Java中访问内存的最佳方法是什么,类似于mmap?

Bri*_*ian 17 java memory

我正在开发一个需要与C应用程序通信的Java应用程序.C应用程序使用共享内存和mmap进行通信,我需要Java应用程序才能访问相同的内存.

我的第一次尝试涉及使用JNI调用从共享内存中检索数据,但每次JNI调用的开销都会导致性能下降,因此我想要一种方法来获取Java中的内存并在Java端进行数据检索.

我的想法是我需要做以下事情:

  1. 使用一个JNI调用来获取我需要附加到的共享内存位置的位置
  2. 创建一个新的FileChannel()
  3. 使用该FileChannel使用map()创建MappedByteBuffer

这是最好的方法吗?另外,我不确定如何实际创建FileChannel以指向正确的内存位置.

Ste*_*eed 11

考虑使用ByteBuffer.allocateDirect.显然,这些缓冲区可以通过JNI层传递给可以直接访问内存的本机代码.

有关提示,请参阅此页面(如下所述).

现在,不仅可以JNI代码发现本机内存空间的地址与Java侧ByteBuffer.allocateDirect()创建的缓冲区内,但它可以分配自己的内存(使用malloc(),例如),然后调用返回JVM以将该内存空间包装在新的ByteBuffer对象中(执行此操作的JNI方法是NewDirectByteBuffer()).

  • 我最终使用了ByteBuffers,他们的工作非常出色.在JNI代码中,我创建了一个ByteBuffer并将其返回给Java代码,然后可以直接访问该内存.最后,我的Java应用程序可以读取内存并写入内存.使用相同内存的任何C/C++应用程序都可以立即看到写入. (2认同)