【发布时间】:2015-03-12 16:08:06
【问题描述】:
我一直在阅读有关内存映射文件的内容,但有几个问题:
- 它们是由操作系统管理还是存在于 JVM 堆中,因此需要进行垃圾回收。
- 如果它们是由操作系统管理的,并且我知道这取决于操作系统,但是如果我有两个进程(Java 或非 Java)来映射一个文件,它们是否会查看相同的位的记忆。 (即,给定一个 1MB 的文件,如果 10 个进程内存映射它,它仍然只使用 ~1MB 的内存)
【问题讨论】:
我一直在阅读有关内存映射文件的内容,但有几个问题:
【问题讨论】:
故意未指定内存映射文件的确切实现,但明显的意图是如果操作系统提供这样的功能,它就会用于实现它。
因此,对于大多数操作系统和 JVM,MappedByteBuffer 只是操作系统函数返回的用于内存映射的逻辑内存的包装器。它仍然需要进行垃圾回收;如果指向映射区域的最后一个前端字节缓冲区被收集,实现将注意释放映射。
如果操作系统通过相同的物理内存页面提供对文件区域的共享访问,则内存映射文件的典型 Java 实现将表现出这种行为。这实际上是在 Java 中实现进程间共享内存的最直接的方式;只是让每个进程映射同一个临时文件的同一个区域……
【讨论】:
MappedByteBuffer)这样做 - 如此有效,我会有一些东西,但不是我堆上的全部 2GB。