为什么有人在私有模式下使用内存映射文件?

时间:2012-04-01 01:28:10

标签: java memory-management io real-time nio

除了文档之外,文档并没有多说:

  

专用:不会传播对生成的缓冲区所做的更改   到该文件,并且对于已映射的其他程序将不可见   同一个文件;相反,他们将导致修改的私人副本   要创建的缓冲区的一部分。 (MapMode.PRIVATE)

在什么情况下它是可取的,它有什么优势?

3 个答案:

答案 0 :(得分:2)

如果您正在对大型数据集运行genetic-algorithm实验,您可能希望启动八个或更多客户端 - 每个核心一个,每个核心两个等 - 以使用相同的起始数据,在执行计算时对数据进行修改,然后仅保存随机数生成器的起始种子的“最终结果”和测量算法的“分数”。

中间结果可能没有任何价值,您不希望任何客户端看到其他客户端的中间结果,也不会污染初始种子数据。

答案 1 :(得分:1)

  

在什么情况下它是可取的,它有什么优势?

当您想要对不应该保留的映射数据进行临时更改时使用它,并且对于可能已映射文件的其他应用程序不应该可见。

在这种用例中,应用程序可以将文件内容明确地复制到byte[],也可以以PRIVATE模式映射文件

期望JVM + OS将以比Java应用程序代码更有效的方式处理私有模式下的数据复制。例如,JVM + OS可能会使用本机虚拟内存子系统在应用程序第一次尝试更新其缓冲区的相应区域时复制映射的VM页面中的数据。

实际实现MapMode.PRIVATE的方式是特定于平台的。如果您需要了解详细信息,请参阅JVM的源代码和操作系统源代码。

答案 2 :(得分:0)

例如,在Linux系统中,进程的.text段以PRIVATE模式加载,实际上它们最初以“写时复制”模式共享内存,如果某个进程尝试修改其代码,则只有该进程才会影响并且没有传播到文件系统。