【问题标题】:Are memory mapped files managed by the OS?内存映射文件是否由操作系统管理?
【发布时间】:2015-03-12 16:08:06
【问题描述】:

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

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

【问题讨论】:

    标签: java memory-mapped-files


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,所以实际映射的内存(比如说它的 2GB)本身并不存在于堆上,只有“指针”(MappedByteBuffer)这样做 - 如此有效,我会有一些东西,但不是我堆上的全部 2GB。
    • 对,其实内存映射是在和堆争夺32位JVM相关的逻辑地址空间,堆最大值设置越大,内存映射可用的逻辑地址空间就越小.
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2018-05-17
    • 2011-07-30
    • 1970-01-01
    • 2014-05-22
    • 2021-10-01
    相关资源
    最近更新 更多