使用Bytebuffers和NIO时如何避免OutOfMemoryError?

jum*_*mar 3 java nio bytebuffer filechannel

我正在使用ByteBuffers并将FileChannels二进制数据写入文件.当为大文件或连续多个文件执行此操作时,我得到一个OutOfMemoryError例外.我在其他地方读过,Bytebuffers与NIO一起使用已被打破,应该避免.你们中是否有人遇到过这种问题,并找到了一个有效地在java文件中保存大量二进制数据的解决方案?

jvm选项是否可行-XX:MaxDirectMemorySize

Out*_*mer 6

我想说不要创建一个包含所有数据的巨大ByteBuffer.创建一个小得多的ByteBuffer,用数据填充它,然后将这些数据写入FileChannel.然后重置ByteBuffer并继续,直到写入所有数据.


Stu*_*son 5

查看Java的“ 映射的字节缓冲区”,也称为“直接缓冲区”。基本上,此机制使用操作系统的虚拟内存分页系统将缓冲区直接“映射”到磁盘。操作系统将能够非常快速地自动神奇地自动将字节移入磁盘和内存,并且您不必担心更改虚拟机选项。与传统的基于Java流的I / O相比,这还将使您能够利用NIO的改进性能,而不会产生任何怪异的破解。

我能想到的仅有两个要点是:

  1. 在32位系统上,所有映射的字节缓冲区的总大小限制为不足4GB 。(这实际上是对我的应用程序的限制,并且我现在在64位体系结构上运行。)
  2. 实现是特定于JVM的,不是必需的。我使用Sun的JVM,没有问题,但是YMMV。

Kirk Pepperdine(一个有点出名的Java性能专家)参与了一个网站www.JavaPerformanceTuning.com,该网站提供了更多MBB详细信息:NIO Performance Tips