OS 是否管理内存映射文件?

Are memory mapped files managed by the OS?

我一直在阅读有关内存映射文件的内容,我有几个问题:

  1. 它们是由操作系统管理的还是存在于 JVM 堆中,因此需要进行垃圾回收。
  2. 如果它们是操作系统管理的,我知道这是 OS 相关的,但是如果我有两个进程(Java 或没有)内存映射一个文件,那他们将查看相同的内存。 (即给定一个 1MB 的文件,如果有 10 个进程内存映射它,它仍然只使用 ~1MB 的内存)

内存映射文件的确切实现是有意未指定的,但明显的意图是,如果操作系统提供了这样的功能,它就会用于实现它。

因此,对于大多数操作系统和 JVM,MappedByteBuffer 只是操作系统内存映射函数返回的逻辑内存的包装器。它仍然需要进行垃圾收集;如果收集到指向映射区域的最后一个前端字节缓冲区,实现将注意释放映射。

如果操作系统通过同一物理内存页提供对文件区域的共享访问,内存映射文件的典型 Java 实现将表现出这种行为。这实际上是 Java 中进程间共享内存最直接的实现方式;只是让每个进程映射同一个临时文件的同一个区域…