繁体   English   中英

我正在尝试加载500Mb文件(Files.readAllBytes),并且我需要大于2 Gb的堆大小。 为什么?

[英]I'm trying to load 500Mb file (Files.readAllBytes) and I need more than 2 Gb Heap size. Why?

我正在尝试在内存(Files.readAllBytes)中加载500Mb文件,并且我需要大于2 Gb的堆大小。

使用默认设置,我有OutOfMemoryError:Java堆空间。 当我设置-Xmx1000m时,它不起作用。 仅当我设置至少-Xmx2300m -Xmx2300m时,它才有效。 为什么Java需要这样的开销?

我想到了两个可能的答案:

  1. 您正在使用的库调用将缓冲区之间的字节复制一次以上,从而有效地增加了所需的内存量。
  2. 堆分为逻辑部分(世代)。 当分配一个不适合一代人使用的“大”对象时,该对象将尽早使用。 如果旧一代中没有空间,则对象分配将失败。 将此与上面的1结合起来,再放一个小堆,就可以看到Java如何遇到麻烦。

解决这两个问题的最简单方法是改为对文件进行内存映射 ,这将在堆外分配内存,并且非常有效/快速地读取文件,因为它减少了读取文件时涉及的OS上下文切换和字节缓冲区副本的数量。 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM