Java 中使用内存映射文件需要考虑的 10 个问题 已翻译 100%

oschina 投递于 2013/11/18 07:00 (共 4 段, 翻译完成于 11-18)
阅读 11774
收藏 205
14
加载中

java中的内存映射IO和内存映射文件是什么?

内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快。加载内存映射文件所使用的内存在Java堆区之外。Java编程语言支持内存映射文件,通过java.nio包和MappedByteBuffer 可以从内存直接读写文件。

bigtiger02
bigtiger02
翻译于 2013/11/18 09:45
4

内存映射的优缺点

内存映射IO最大的优点可能在于性能,这对于建立高频电子交易系统尤其重要。内存映射文件通常比标准通过正常IO访问文件要快。另一个巨大的优势是内存映 射IO允许加载不能直接访问的潜在巨大文件 。经验表明,内存映射IO在大文件处理方面性能更加优异。尽管它也有不足——增加了页面错误的数目。由于操作系统只将一部分文件加载到内存,如果一个请求 页面没有在内存中,它将导致页面错误。同样它可以被用来在两个进程中共享数据。

bigtiger02
bigtiger02
翻译于 2013/11/18 10:08
4

支持内存映射IO的操作系统

大多数主流操作系统比如Windows平台,UNIX,Solaris和其他类UNIX操作系统都支持内存映射IO和64位架构,你几乎可以将所有文件映射到内存并通过JAVA编程语言直接访问。

Java的内存映射IO的要点

如下为一些你需要了解的java内存映射要点:

bigtiger02
bigtiger02
翻译于 2013/11/18 10:19
4
  1. java通过java.nio包来支持内存映射IO。
  2. 内存映射文件主要用于性能敏感的应用,例如高频电子交易平台。
  3. 通过使用内存映射IO,你可以将大文件加载到内存
  4. 内存映射文件可能导致页面请求错误,如果请求页面不在内存中的话。
  5. 映射文件区域的能力取决于于内存寻址的大小。在32位机器中,你不能访问超过4GB或2 ^ 32(以上的文件)。
  6. 内存映射IO比起Java中的IO流要快的多。
  7. 加载文件所使用的内存是Java堆区之外,并驻留共享内存,允许两个不同进程共享文件。
  8. 内存映射文件读写由操作系统完成,所以即使在将内容写入内存后java程序崩溃了,它将仍然会将它写入文件直到操作系统恢复。
  9. 出于性能考虑,推荐使用直接字节缓冲而不是非直接缓冲。
  10. 不要频繁调用MappedByteBuffer.force()方法,这个方法意味着强制操作系统将内存中的内容写入磁盘,所以如果你每次写入内存映射文件都调用force()方法,你将不会体会到使用映射字节缓冲的好处,相反,它(的性能)将类似于磁盘IO的性能。
  11. 万一发生了电源故障或主机故障,将会有很小的机率发生内存映射文件没有写入到磁盘,这意味着你可能会丢失关键数据。

小伙伴们,就是这些。内存映射IO是高级程序员特别是对于用Java编写高性能应用的程序员来说是一个重要的概念。 如果你喜欢这些建议的话,你可以到我的博客http://javarevisited.blogspot.com 来浏览更多类似文章。

谢谢!

bigtiger02
bigtiger02
翻译于 2013/11/18 10:58
4
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(11)

你是错的我恒对
你是错的我恒对
Java的内存映射IO的要点 8 原文原意为 操作系统正常的话 它仍将把所有内容 写入文件
E-leven11
E-leven11

引用来自“fmc”的评论

不明觉厉

+1
fmc
fmc
不明觉厉
Jakes
Jakes
博客貌似挂了。一般都用系统的api实现。
Smile月光
Smile月光
说白点就是NIO的特性
Yale_Tsang
Yale_Tsang
怎么收藏啊==
大师兄悟空
大师兄悟空
好大的交道
ThinkingH
ThinkingH
头一次听说
张乐1024
张乐1024
看过了,顶一下,虽然不太懂
故乡月
故乡月
收藏。
返回顶部
顶部