`

为何要在Java中使用内存映射文件(Memory Mapped File)或者MappedByteBuffer

    博客分类:
  • Java
 
阅读更多

尽管从JDK 1.4版本开始,Java内存映射文件(Memory Mapped Files)就已经在java.nio包中,但它对很多程序开发者来说仍然是一个相当新的概念。引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高性能Java应用应该使用内存映射文件来持久化数据。这在一些交易非常频繁的场合已经应用得很多,这些场合要求电子交易系统必须非常快速,单向时延要小于毫秒级。IO一直是那些高性能系统的一个主要关注点,内存映射文件允许你使用direct或者non-direct 字节缓存(Byte buffer)来直接读写内存。内存映射文件的一个关键优势是操作系统负责真正的读写,即使你的程序在刚刚写入内存后就挂了,操作系统仍然会将内存中的数据写入文件系统。另外一个更突出的优势是共享内存,内存映射文件可以被多个进程同时访问,起到一种低时延共享内存的作用。

 

什么是Java内存映射文件/IO

内存映射文件是一种允许Java程序直接从内存访问的特殊文件。通过将整个文件或者文件的一部分映射到内存中、操作系统负责获取页面请求和写入文件,应用程序就只需要处理内存数据,这样可以实现非常快速的IO操作。用于内存映射文件的内存在Java的堆空间以外。Java中的java.nio包支持内存映射文件,可以使用MappedByteBuffer来读写内存。

 

内存映射文件的优缺点

可能内存映射IO的主要优势是性能,内存映射文件比通过普通的IO来访问文件要快,这对于繁忙的电子交易系统来说非常重要。内存映射IO另外一个优势是能够加载普通方式无法访问的大文件,实验表明内存映射IO在大文件处理中表现得更好;但缺点是有增加页面错误(page fault)的可能,因为操作系统仅仅加载一部分文件到内存中,如果被请求的页面不在内存中那就会导致一个页面错误。大多数主流操作系统如Windows, Unix, Solaris和其他类Unix的操作系统都支持内存映射IO,在64位架构下,你几乎可以将任何文件映射到内存中并直接使用Java访问。另外一个优势是这些文件能够共享,在进程间提供共享内存,而且比普通的基于loopback接口的Socket要快10倍。

 

Java中MappedByteBuffer读写样例

下面的例子演示了如何使用内存映射文件来读写。我们使用RandomAccessFile打开文件并使用FileChannel的map()方法将它映射到内存,map()方法有三个输入参数:mode, position, size。返回值MappedByteBuffer是用来处理内存映射文件的字节缓存。

 

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;


public class MemoryMappedFileInJava {


    private static int count = 10485760; // 10 MB


    public static void main(String[] args) throws Exception {


        RandomAccessFile memoryMappedFile = new RandomAccessFile("largeFile.txt", "rw");


        // Mapping a file into memory
        MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, count);


        // Writing into Memory Mapped File
        for (int i = 0; i < count; i++) {
            out.put((byte) 'A');
        }
        System.out.println("Writing to Memory Mapped File is completed");


        // reading from memory file in Java
        for (int i = 0; i < 10; i++) {
            System.out.print((char) out.get(i));
        }
        System.out.println("Reading from Memory Mapped File is completed");


        memoryMappedFile.close();
    }


}

 

总结

 

下面快速总结一下Java内存映射文件和IO

1). Java语言通过java.nio包支持内存映射文件和IO。

2). 内存映射文件用于对性能要求高的系统中,如繁忙的电子交易系统

3). 使用内存映射IO你可以将文件的一部分加载到内存中

4). 如果被请求的页面不在内存中,内存映射文件会导致页面错误

5). 将一个文件区间映射到内存中的能力取决于内存的可寻址范围。在32位机器中,不能超过4GB,即2^32比特。

6). Java中的内存映射文件比流IO要快(译注:对于大文件而言是对的,小文件则未必)

7). 用于加载文件的内存在Java的堆内存之外,存在于共享内存中,允许两个不同进程访问文件。顺便说一下,这依赖于你用的是direct还是non-direct字节缓存。

8). 读写内存映射文件是操作系统来负责的,因此,即使你的Java程序在写入内存后就挂掉了,只要操作系统工作正常,数据就会写入磁盘。

9). Direct字节缓存比non-direct字节缓存性能要好

10). 不要经常调用MappedByteBuffer.force()方法,这个方法强制操作系统将内存中的内容写入硬盘,所以如果你在每次写内存映射文件后都调用force()方法,你就不能真正从内存映射文件中获益,而是跟disk IO差不多。

11). 如果电源故障或者主机瘫痪,有可能内存映射文件还没有写入磁盘,意味着可能会丢失一些关键数据。

12). MappedByteBuffer和文件映射在缓存被GC之前都是有效的。sun.misc.Cleaner可能是清除内存映射文件的唯一选择。

 

关于Java内存映射文件和内存映射IO就说这些了。 这相当有用,我希望你能够再深入了解一些。如果你的工作与繁忙的电子交易系统有关,那你很可能用到内存映射文件。

原文链接:http://javarevisited.blogspot.hk/2012/01/memorymapped-file-and-io-in-java.html

分享到:
评论

相关推荐

    Java中使用内存映射实现大文件上传实例

    Java中的内存映射(Memory-Mapped File)是一种高效处理大文件的技术,它允许将文件直接映射到进程的虚拟内存空间中,使得程序可以像访问内存一样直接读写文件,从而提高了大文件处理的性能。这种方法尤其适用于需要...

    Java中用内存映射处理大文件的实现代码

    本文将详细介绍如何在Java中使用内存映射文件,并通过示例代码进行演示。 内存映射文件是通过Java的NIO(New Input/Output)包中的FileChannel类来实现的。FileChannel提供了map()方法,可以将文件的一部分或全部...

    java csv大数据量导出(千万级别,不会内存溢出)

    此外,为了避免内存中的临时数据过多,还可以考虑使用Java的内存映射文件(Memory-Mapped File)。通过MappedByteBuffer,我们可以让操作系统负责数据的缓存和页面交换,这在处理大文件时能显著降低内存使用。 在...

    commons-mmf.rar_java nio_java共享内存_共享内存

    在Java中,可以通过`java.nio.MappedByteBuffer`类来实现共享内存功能,这被称为内存映射文件(Memory-Mapped File,MMF)。 `MappedByteBuffer`是NIO中的一种特殊缓冲区,它将文件的一部分映射到内存中,使得文件...

    mmf4j:MemoryMappedFiles4Java

    MemoryMappedFiles4Java 描述 该库旨在将内存映射文件引入Java。 与已经存在的MappedByteBuffer相比,目标是更好地控制创建,修改和销毁。 它试图统一在不同操作系统上使用此类映射的接口,这意味着许多细节无法实现...

    java nio 包读取超大数据文件

    在Java NIO中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高读取效率。内存映射文件是一种将文件内容直接映射到内存中的技术,使得对文件的操作如同操作内存一样简单高效。下面...

    MemMapComm:代码存储库,用于使用Java的内存映射文件测试IPC

    **在Java中使用内存映射文件进行IPC:** 1. **打开文件通道**:首先需要通过`FileChannel`类的静态方法`open()`或者`new FileInputStream().getChannel()`等方法获取文件通道。 2. **映射文件**:使用`FileChannel....

    精选_基于JAVA实现的操作系统文件系统_源码打包

    6. **内存映射文件(Memory-Mapped File)**:Java的MappedByteBuffer允许将文件直接映射到内存,提供高性能的大数据访问。 7. **权限与访问控制**:模拟真实系统中的用户权限模型,如Unix的用户组和权限位,可以...

    java高速文件缓存

    在Java中实现高效的文件缓存策略,可以利用Java集合框架、内存管理机制以及第三方库来达到目的。 一、Java内存模型与缓存策略 Java内存模型分为堆内存(Heap)和栈内存(Stack),其中堆内存用于存储对象实例,包括...

    java io读取文件

    在Java编程语言中,`IO`(Input/Output)是处理数据输入和输出的核心部分,尤其是在处理大数据量文件时显得尤为重要。Java IO API提供了一系列类和接口,使得开发者能够高效地读取、写入和操作文件。下面我们将深入...

    基于Java的源码-二进制IO类与文件复制操作实例.zip

    7. **内存映射文件(Memory-Mapped File)**:对于大文件操作,Java还提供了MappedByteBuffer,它可以将文件映射到内存,使得文件操作如同访问内存一样高效。 8. **NIO(New IO)**:Java NIO提供了一种非阻塞的IO...

    java NIO.zip

    6. **内存映射文件(Memory-Mapped Files)**: NIO允许将文件直接映射到内存,使得读写文件就像操作普通缓冲区一样快速。通过MappedByteBuffer类,可以直接在内存中对文件进行操作,提高大文件处理的性能。 7. **...

    mmapcom:内存映射文件实用程序库,用于存放更大尺寸的文件

    内存映射文件(Memory-Mapped File)是一种在操作系统层面实现的高效文件读写技术,它允许将文件直接映射到进程的虚拟地址空间中,使得文件操作如同访问内存一样便捷。`mmapcom`是一个针对Java平台的内存映射文件...

    文件操作工具类

    此外,内存映射文件(Memory-Mapped File)也是提高大文件访问速度的一种方法,Java的`MappedByteBuffer`实现了这一功能。 九、文件操作的安全性和异常处理 在进行文件操作时,必须考虑到安全性问题,避免因文件...

    五,Android文件IO详解

    使用`java.nio.MappedByteBuffer`,可以直接将文件映射到内存中,这样可以减少磁盘I/O,提高性能。但需要注意,映射的文件大小不应超过可用的物理内存,否则可能导致`OutOfMemoryError`。 在Android 6.0(API级别23...

    J2SE.development.code.MemMapFile.rar_Java编程_Java_

    在标题和描述中提到的“MemMapFile”是Java中的一种内存映射文件(Memory-Mapped File)技术,它允许我们将文件直接映射到虚拟内存中,从而高效地读写大文件。这种技术在处理大量数据时非常有用,因为它可以利用操作...

    Java IO流总结

    内存映射文件(Memory-Mapped File)是一种将文件直接映射到进程的虚拟内存空间的技术,使得可以直接通过指针访问文件,极大地提高了大文件处理的性能。通过java.nio.channels.FileChannel的map()方法,可以创建...

    java读取大文件简单实例

    为了解决这个问题,Java提供了一种名为“内存映射文件”(Memory-Mapped File)的技术,它允许我们将文件的部分内容映射到虚拟内存中,从而实现大文件的高效读写。 内存映射文件通过`java.nio`包中的`...

    ProgressA.zip

    在Java中,`java.nio.MappedByteBuffer`类提供了内存映射文件的功能。然而,在JavaFX中,内存映像文件通信不常见,因为它通常用于大文件操作,而不是简单的线程间通信。 在提供的"ProgressA"可执行文件中,可能包含...

    Mapped_Store

    在Java编程中,`Mapped_Store` 提到了一个关键的概念,那就是内存映射文件(Memory-Mapped File)。这个技术是Java NIO(New IO)库的一部分,它允许我们将文件直接映射到进程的虚拟内存中,从而实现高效的数据读写...

Global site tag (gtag.js) - Google Analytics