我正在尝试在内存中加载 500Mb 文件 (Files.readAllBytes),并且我需要超过 2 Gb 的堆大小。
使用默认设置时,出现 OutOfMemoryError: Java 堆空间。当我设置 -Xmx1000m 时它不起作用。仅当我设置至少 -Xmx2300m -Xmx2300m 时它才有效。为什么 Java 需要这么大的开销?
最佳答案
我想到了两个可能的答案,
- 您使用的库调用会在缓冲区之间多次复制字节,从而有效地增加了您所需的内存量。
- 堆被分成逻辑部分(代)。当分配一个不适合一代的“大”对象时,该对象将被提前保留。如果旧代中没有空间,则对象分配将失败。将此与上面的 1 结合起来,形成一个小堆,人们可以看到 Java 如何遇到麻烦。
解决这两个问题的最简单方法是 memory map the file相反,这将在堆外分配内存,并且在读取文件时非常高效/快速,因为它减少了读取文件时涉及的操作系统上下文切换和字节缓冲区副本的数量。
关于java - 我正在尝试加载 500Mb 文件 (Files.readAllBytes),并且需要超过 2 Gb 的堆大小。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575749/