当前位置: 首页 > 知识库问答 >
问题:

java OOM创建2个10亿整数的数组

林项明
2023-03-14

我用java写了一个简单的程序来创建2个10亿大小的整型数组。我用-Xms10G,也就是10GB的内存运行这个程序,但还是出现了OOM错误。下面是片段。

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。尺寸);它返回小于2GB的1,935,228,928。所以我的程序的总需求是最大4GB。

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

我尝试了选项——xms 10g-XX:new ratio = 1——这很有效。

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

我尝试通过-Xms9G-XX:NewRatio=0.5为eden提供更多内存,但java抱怨参数非法。

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

这只是一个实验项目,我只是操纵阵列的位置。我想在尽可能短的时间内完成。有人能建议如何去做吗?有哪些java选项,为什么?

共有2个答案

弓温书
2023-03-14

和这里一样的问题。

在默认使用并行GC的JDK 8中,10 GB堆被分成6.67 GB旧代3.33 GB年轻代。因此,没有空间容纳两个连续的3.72 GB块(10亿四字节整数)。

解决这个问题最简单的方法是打开G1 GC,完全避免复杂的世代规模。然后,您的示例将使用8 GB堆:

java -XX:+UseG1GC -Xmx8g TestBigIntArraySize
丁雅惠
2023-03-14

因此,假设倍数位长度可能不是获取字节计数的最佳方法。正如@mayamar提到的,您的实际内存使用量约为2 * 4 GB。

无论如何,让我们进入实际的调谐短语。4GB可能太大了,将直接存储在老一代中。因此,您需要增加旧的基因大小。更改新的世代设置可能会起作用,但这是...好吧,你实际上是在关闭老一代。它可能会损害测试用例的其他部分。

您尝试< code>NewRatio=1使新旧gen比率为1:1,而不是更好的比率,例如1:100。然而,如果这个比率太大,JVM可能无法启动(在VM初始化期间进行GC)。最好用< code>MaxNewSize来指定它。

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

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

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

 类似资料:
  • 本文向大家介绍2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数?相关面试题,主要包含被问及2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数?时的应答技巧和注意事项,需要的朋友参考一下 整数个数一共有2^32个,可以将划分为2^8个区域,比如用一个文件代表一个区域,然后将数据分离到不同的区域,再在不同的区域利用bitmap就可以找个各自区域内不重复

  • 我只能给出一个强力解决方案,即以O(nlogn)时间复杂度对数组进行排序,并取最后100个数字。 面试官在寻找一个更好的时间复杂性,我尝试了几个其他的解决方案,但都没能回答他。有更好的时间复杂性解决方案吗?

  • 需要创建一个函数(s)来完成10个随机整数值的数组,并返回3个最大值的乘数。我这样试过smth 但它不起作用(

  • 问题内容: 我想将同一数组的2个部分组合成一个复杂的数组: 这些不起作用: 我想念什么吗?numpy是否不喜欢对复数执行数组函数?这是错误: 问题答案: 这似乎可以满足您的要求: 这是另一种解决方案: 还有另一个更简单的解决方案: PS :如果要保存内存(无中间阵列): devS的以下解决方案也很快。

  • 我有一个字符串数组和一个整数数组。如何使用第一个作为键,第二个作为值来创建地图? 如何在 Kotlin 中将 List 转换为 Map?不能解决这个问题;我有2个数组,想要一个地图。

  • 我试图创建一个没有重复的随机数组。 任务是从用户那里获取一个整数数组和最大值,用0到最大值之间的随机数填充数组,并显示没有重复的随机数组,不使用任何其他类,除了随机和扫描仪。 这是一个示例输出: 请输入数组的大小:10 请输入最大值:50 [39,2,17,49,12,19,40,31,42,15] 我需要帮助删除重复的内容。我不确定我所做的是否正确,我是一个初学者,但这是我目前所做的。非常感谢帮