MappedByteBuffer - 页面到物理内存的映射

Posted

技术标签:

【中文标题】MappedByteBuffer - 页面到物理内存的映射【英文标题】:MappedByteBuffer - mapping of pages into physical memory 【发布时间】:2014-03-14 13:22:17 【问题描述】:

据我所见,MappedByteBuffer 在调用FileChannel.map 后将文件内容“映射”到内存中,但不一定将整个文件加载进去。所以,如果我开始阅读例如在 pos(0),一个页面可能实际上是从磁盘加载的,例如文件的前 4096 字节,进入主内存(在堆之外,因为它是直接内存缓冲区)。

我的问题是 - 如果我在缓冲区上调用 load() 方法会发生什么?那是否会尽力将整个文件映射到内存中,例如考虑到这是我映射的数量,正好加载 1GB 的数据?

【问题讨论】:

【参考方案1】:

它会尝试将整个文件映射到内存中吗?考虑到这是我映射的数量,正好加载 1GB 的数据?

基本上是的。 JVM 将尝试实现这一目标。

但是“尽力而为”意味着不能保证整个文件都会被加载。并且不能保证文件将保持加载状态。

行为最终由操作系统(管理虚拟内存资源)决定,它取决于系统上有多少物理内存、其他应用程序需要什么,以及可能取决于其他事物。

【讨论】:

以上是关于MappedByteBuffer - 页面到物理内存的映射的主要内容,如果未能解决你的问题,请参考以下文章

使用 java.nio.MappedByteBuffer 时防止 OutOfMemory

Java深层系列「并发编程系列」深入分析和研究MappedByteBuffer的实现原理和开发指南

☕Java深层系列「并发编程系列」深入分析和研究MappedByteBuffer的实现原理和开发指南

MappedByteBuffer - BufferOverflowException

使用 MappedByteBuffer 时出现 IndexOutOfBoundsException

MappedByteBuffer的实际开发遇到的问题