关于 Java 中的内存映射文件,你必须知道的 10 件事






4.71/5 (4投票s)
内存映射 IO 是 Java 程序可用的最快的 IO 选项之一。如果您正在编写对延迟敏感的应用程序,其中 IO 可能会影响您的数据,那么使用 MemoryMappedByteBuffer 是一个不错的选择。
什么是 Java 中的内存映射文件和 IO
内存映射文件非常特殊,它允许 Java 程序直接从内存访问内容。这是通过将整个文件或文件的一部分映射到内存来实现的,操作系统负责加载请求的页面并在应用程序仅处理内存时写入文件,从而实现非常快速的 IO 操作。用于加载内存映射文件的内存位于 Java 堆空间之外。Java 编程语言使用 java.nio
包支持内存映射文件,并具有 MappedByteBuffer
来从内存读取和写入。
内存映射文件的优点和缺点
内存映射 IO 的主要优点可能是性能,这对于构建高频电子交易系统非常重要。内存映射文件比通过普通 IO 进行的标准文件访问快得多。内存映射 IO 的另一个大优点是它允许您加载可能更大的文件,否则无法访问。实验表明,内存映射 IO 在处理大型文件时表现更好。尽管它在增加页面错误数量方面存在缺点。由于操作系统仅将文件的一部分加载到内存中,如果请求的页面不存在于内存中,则会导致页面错误。它也可以用于在两个进程之间共享数据。
操作系统中的内存映射 IO 支持
大多数主要操作系统(如 Windows 平台、UNIX、Solaris 和其他类似 UNIX 的操作系统)都支持内存映射 IO,并且在64 位架构中,您几乎可以将任何文件映射到内存中,并使用 Java 编程语言直接访问它。
Java 中内存映射 IO 的要点
以下是关于 Java 中内存映射文件的一些重要知识点:
- Java 使用
java.nio
包支持内存映射 IO。 - 内存映射文件用于对性能敏感的应用程序,例如高频电子交易平台。
- 通过使用内存映射 IO,您可以在内存中加载大型文件的一部分。
- 如果请求的页面不在内存中,内存映射文件可能会导致页面错误。
- 在内存中映射文件区域的能力取决于内存的可寻址大小。在 32 位机器中,您无法访问超过 4GB 或 2^32 的空间。
- 在 Java 中,内存映射 IO 比 Stream IO 快得多。
- 用于加载文件的内存位于 Java 堆之外,并驻留在共享内存中,这允许两个不同的进程访问该文件。
- 对内存映射文件的读写由操作系统完成,因此即使您的 Java 程序在将内容放入内存后崩溃,它也会写入到文件,直到操作系统正常为止。
- 为了获得更快的性能,请优先使用 Direct Byte 缓冲区而不是 NonDirect 缓冲区。
- 不要过于频繁地调用
MappedByteBuffer.force()
方法,此方法旨在强制操作系统将内存内容写入磁盘。因此,如果您每次写入内存映射文件时都调用force()
方法,您将看不到使用映射字节缓冲区的真正好处,相反,它会类似于磁盘 IO。 - 在发生电源故障或主机故障的情况下,内存映射文件的内容有很小的可能没有写入磁盘,这意味着您可能会丢失关键数据。
各位,就这些了。内存映射 IO 是高级 Java 开发人员的重要概念,尤其是在 Java 中编写高性能应用程序时。如果您喜欢这个提示,那么您可能想访问我的博客 http://javarevisited.blogspot.com 以获取更多此类提示。
谢谢!