Java内存映射文件?

8

Java中的内存映射文件是否类似于Windows的内存映射文件?还是仅基于内存和文件常规操作的模拟?

2个回答

10

它使用操作系统对内存映射文件的支持。

我正在努力查找有关此支持的文档,但我尚未找到任何确凿的证据。然而,文档中的各个部分确实指出了这样的事情:

许多内存映射文件的细节本质上取决于底层操作系统,因此是未指定的。当请求区域不完全包含在该通道的文件中时,此方法的行为是未指定的。无论是由本程序还是其他程序对底层文件的内容或大小进行的更改,是否将其传播到缓冲区是未指定的。更改缓冲区传播到文件的速率是未指定的。

如果一切都只是模拟的话,就没有必要出现这种未指定的行为。


谢谢@Jon的回答!我理解你的意思是:java.nio类(用于操作内存映射文件)包装了Windows API内存映射文件函数?我是对的吗?))) - Edward83
1
我尝试进行一些测试。我想创建一个MMF并在两个进程之间共享它:Win32 C++和使用nio的Java。但是测试失败了,因为我发现我无法在Java中创建/打开“命名”的MMF。哈哈))) - Edward83

9
阅读您的问题和评论,您想做的是使用内存映射文件在Java和C ++应用程序之间共享内存/对象。
我的建议是不要尝试这样做
要使此过程可靠,需要解决一些困难问题:
  • 同步两个应用程序对共享数据结构的使用,
  • 确保一个应用程序所做的更改得到可靠地写入主内存并被另一个应用程序读取,
  • 确保更改以预期顺序刷新到磁盘。
Java面临的一个问题是您无法将Java对象放入内存映射区域。 相反,您必须以与C ++方面期望的表示兼容的方式对它们进行序列化和反序列化。
最后,即使您成功解决了所有这些问题,您的解决方案也可能很脆弱,因为它依赖于操作系统、C ++和Java实现的未指定行为,如果更改上述任何版本,则可能会更改

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接