内存映射文件和直接缓冲区的区别是:直接缓冲区是在用户态里JVM堆外(RAM上)申请了一块空间,我们在这块空间上进行随机读写数据。内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数。
直接缓冲区
是在用户态里JVM堆外(RAM上)申请了一块空间,我们在这块空间上进行随机读写数据。
直接缓冲区是为加快I/O 速度,使用一种特殊方式为其分配内存的缓冲区,JDK 文档中的描述为:给定一个直接字节缓冲区,Java虚拟机将尽最大努力直接对它执行本机I/O 操作。也就是说,它会在每一次调用底层操作系统的本机I/O 操作之前(或之后),尝试避免将缓冲区的内容拷贝到一个中间缓冲区中或者从一个中间缓冲区中拷贝数据。要分配直接缓冲区,需要调用allocateDirect()方法,而不是allocate()方法,使用方式与普通缓冲区并无区别,
内存映射文件
内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数。
一般在读文件的时候 我们发起一个read调用,该调用会把磁盘里的数据拷贝内核的page cache里,然后再从内核的page cache拷贝到用户态的byte数组里,接下来我们操作的是用户态里的byte数组里面的数据。
而内存映射文件则跳过了磁盘文件数据在用户态和内核态之间的拷贝操作,直接操作内核态的page cache。page cache和磁盘之间的交互则由系统完成。
很明显可以看到直接缓冲区和内存映射文件的使用场景是不太一样的。
延伸阅读:
内存映射文件适用范围
这种函数最适用于需要读取文件并且对文件内包含的信息做语法分析的应用程序,如:对输入文件进行语法分析的彩色语法编辑器,编译器等。
把文件映射后进行读和分析,能让应用程序使用内存操作来操纵文件,而不必在文件里来回地读、写、移动文件指针。
有些操作,如放弃“读”一个字符,在以前是相当复杂的,用户需要处理缓冲区的刷新问题。在引入了映射文件之后,就简单的多了。应用程序要做的只是使指针减少一个值。
映射文件的另一个重要应用就是用来支持永久命名的共享内存。要在两个应用程序之间共享内存,可以在一个应用程序中创建一个文件并映射之,然后另一个应用程序可以通过打开和映射此文件把它作为共享的内存来使用。VC++使用内存映射文件处理大文件
文章标题:内存映射文件和直接缓冲区的区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37900