我正在尝试用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内存,但我正在尝试提交在线编码挑战的代码。在那里它也失败了,我将无法改变那里的设置。
是否有任何标准限制或指导用于创建不应超过的大型数组?
答案 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
是否足够好? byte
比int
小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堆。