Java数组

时间:2017-04-07 06:34:31

标签: java arrays limits

我正在尝试用Java创建2D数组,如下所示:

int[][] adjecancy = new int[96295][96295];

但它失败并出现以下错误:

JVMDUMP039I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" at 2017/04/07 11:58:55 - please wait.
JVMDUMP032I JVM requested System dump using 'C:\eclipse\workspaces\TryJavaProj\core.20170407.115855.7840.0001.dmp' in response to an event
JVMDUMP010I System dump written to C:\eclipse\workspaces\TryJavaProj\core.20170407.115855.7840.0001.dmp
JVMDUMP032I JVM requested Heap dump using 'C:\eclipse\workspaces\TryJavaProj\heapdump.20170407.115855.7840.0002.phd' in response to an event
JVMDUMP010I Heap dump written to C:\eclipse\workspaces\TryJavaProj\heapdump.20170407.115855.7840.0002.phd

解决这个问题的方法是增加JVM内存,但我正在尝试提交在线编码挑战的代码。在那里它也失败了,我将无法改变那里的设置。

是否有任何标准限制或指导用于创建不应超过的大型数组?

5 个答案:

答案 0 :(得分:13)

int[][] adjecancy = new int[96295][96295];

当你这样做时,你试图分配几乎96525*96525*32 MB的37091位,这几乎是37演出。仅仅从Java获取内存是非常不可能的。

我认为您的程序初始化不需要太多数据。可能你必须看看ArrayList,它给你动态的大小分配,然后在运行时继续释放是一个需要考虑的关键。

创建数组没有限制或限制。只要你有记忆,就可以使用它。但请记住,你不应该占用一块内存,这会让JVM变得忙碌。

答案 1 :(得分:3)

数组显然必须适合内存。如果没有,典型的解决方案是:

  • 你真的需要int(最大值2,147,483,647)吗?也许byte(最多 值127)或short是否足够好? byteint小8倍。
  • 你在数组中有很多相同的值(比如零)吗?尝试使用稀疏数组。

例如:

Map<Integer, Map<Integer, Integer>> map = new HashMap<>();
map.put(27, new HashMap<Integer, Integer>()); // row 27 exists
map.get(27).put(54, 1); // row 27, column 54 has value 1.

它们需要存储每个值更多的内存,但基本上没有数组空间的限制(你可以使用Long而不是Integer作为索引来使它们真的很大)。

  • 也许你只是不知道数组应该有多长?试试ArrayList,它会自行调整大小。使用ArrayList ArrayLists用于2D数组。

  • 如果没有其他帮助,请使用RandomAccessFile将过度生长的数据存储到文件系统中。在良好的工作站上,这些时间100 Gb或大约不是问题,您只需要在文件中计算所需的偏移量。文件系统显然比RAM慢得多,但具有良好的SSD驱动可能是可以承受的。

答案 2 :(得分:1)

建议分配可以分配的最大堆大小是机器RAM大小的1/4。

Java中的1个int需要4个字节,而你的数组分配需要大约37.09GB的内存。

在这种情况下,即使我假设您正在为一个阵列分配Full Heap,您的机器也应该在148GB左右。这是巨大的。

看看下面的内容。

参考:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html

希望这有帮助。

答案 3 :(得分:0)

它取决于JVM可用的最大内存和阵列的内容类型。对于int,我们有4个字节的内存。现在,如果您的计算机上有1 MB内存可用,它最多可以保存1024 * 256个整数(1 MB = 1024 * 1024字节)。记住这一点,你可以相应地创建你的2D数组。

答案 4 :(得分:0)

您可以创建的数组取决于JVM堆大小。

96295 * 96295 * 4(每个字节的字节数)= 37,090,908,100字节= ~34.54 GBytes。竞争法典判断中的大多数JVM都没有那么多内存。因此错误。

要了解可用于给定堆大小的数组大小 - 使用不同的-Xmx设置运行此代码段:

    Scanner scanner = new Scanner(System.in);
    while(true){
        System.out.println("Enter 2-D array of size: ");
        size = scanner.nextInt();

        int [][]numbers = new int[size][size];
        numbers = null;
    }

e.g。使用-Xmx 512M - &gt; ~10k +元素的二维数组。

一般来说,大多数在线评委在评估提交时都有 ~1.5-2GB堆