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

标签 java

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

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

最佳答案

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

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

解决这两个问题的最简单方法是 memory map the file相反,这将在堆外分配内存,并且在读取文件时非常高效/快速,因为它减少了读取文件时涉及的操作系统上下文切换和字节缓冲区副本的数量。

关于java - 我正在尝试加载 500Mb 文件 (Files.readAllBytes),并且需要超过 2 Gb 的堆大小。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575749/

相关文章:

java - Spring MVC 在 WEB-INF/views/package 中找不到合适的 jsp

java - 无法通过蓝牙设备地址在android中创建套接字

java - Hibernate 搜索 - '%like%' 类型查询

java - 使 jface 向导在点击按钮/链接时开始

java - 无法使用 TesseractOCRConfig Apache Tika 提取扫描的 pdf

java - 如何从 URL 获取 token 并在 Instagram 授权后重定向回应用程序?

java - 旋转图像上的碰撞检测

java - 如何在弹出消息中找到用户名和密码时在移动应用程序中找到检查元素

java - netbeans 有类似 Eclipse 调试显示 View 的东西吗

java - 带标签的break语句问题