【问题标题】:java OOM on creating 2 arrays of one billion intsjava OOM 创建 2 个十亿整数的数组
【发布时间】:2019-03-25 00:38:01
【问题描述】:

我正在用 java 编写简单的程序来创建 2 个 10 亿大小的 int 数组。 我用 -Xms10G 运行这个程序,即 10GB 内存仍然出现 OOM 错误。 下面是sn-p。

public class TestBigIntArraySize {
  public static int arraySize = 1000_000_000;
  public static int [] firstArray = new int[arraySize];
  public static int [] secondArray = new int[arraySize];

  public static void main(String[] args) {
    System.out.println(1000_000_000 * Integer.SIZE);
  }
}

据我所知,用于 10 亿个 int 数组的内存是 System.out.println(1000_000_000 * Integer.SIZE); 它返回小于 2GB 的 1,935,228,928。所以我的程序总要求最大为 4GB。

即使我在方法调用中创建数组并返回数组或静态(如下所示)或在 main() 内,也会出现错误。 它工作所需的内存是 12G,是我预期的 3 倍。 我正在使用 oracle java:jdk1.8.0_201

我尝试了选项 -Xms10G -XX:NewRatio=1 --- 有效。

但我想进一步减少内存占用。

我尝试了通过-Xms9G -XX:NewRatio=0.5 为伊甸园提供更多内存的选项,但 java 抱怨参数非法。

我尝试了通过-Xms9G -XX:NewRatio=1 -XX:PretenureSizeThreshold=10000 直接将数组分配给旧代的选项。但这也会给OOM。

这只是一个实验项目,我只是在适当地操作数组。我想在尽可能小的内存中进行。 有人可以建议如何去做吗?有哪些 java 选项,为什么?

【问题讨论】:

  • 1,935,228,928 的输出无效,因为结果大于 maxint。如果您更改为 long (1000_000_000L),则结果为 32,000,000,000。
  • 我太不听话了!! ..谢谢..

标签: java jvm out-of-memory jvm-arguments


【解决方案1】:

所以让我们说位长度的倍数可能不是获得字节数的最佳方法。正如@mayamar 所提到的,您的实际内存使用量约为 2*4 gigabyte

无论如何,让我们来看看实际的调音短语。 4GB 可能太大,会直接存储在老一代。所以你需要增加老一代的规模。更改新的一代设置可能会起作用,但那是......好吧,你实际上是在关闭旧一代。它可能会对您的其他部分测试用例造成伤害。

您的尝试NewRatio=1 使新旧代的比率为 1:1,而不是更好的东西,例如1:100。然而,如果你使比率太大,JVM 可能无法启动(VM 初始化期间的 GC)。最好使用MaxNewSize 指定它。

最后,运行与此类似的东西将非常接近您的“最小化内存占用”要求。

java -Xmx8400000000 -XX:MaxNewSize=30M -XX:OldSize=8300000000 TestBigIntArraySize 

注意:最好保留几十兆字节,因为 JVM 本身需要内存来运行。如果您的程序不像您的 MVCE 那样小,如果您不希望 GC 时不时地启动,则需要留出更多空间。

【讨论】:

    【解决方案2】:

    here一样的问题。

    在默认使用 Parallel GC 的 JDK 8 中,10 GB 堆分为 6.67 GB 老年代 + 3.33 GB 新生代。因此,没有空间容纳两个 3.72 GB(10 亿个四字节整数)的连续块。

    解决该问题的最简单方法是打开 G1 GC 并完全避免棘手的生成大小调整。然后,您的示例将使用 8 GB 堆:

    java -XX:+UseG1GC -Xmx8g TestBigIntArraySize
    

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多