我编写了一个代码,我希望传递一些不同大小的列表,但是当我的列表大小超过1024时,它会抛出以下异常!我怎么处理它?</ p>
size, running time for x
2,184073
3,98308
5,617257
9,481714379
17,55230
33,64505
65,41094
129,65120
257,102555
513,197511
1025,465897
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at OBSTclasses.MemoizedVersion.<init>(MemoizedVersion.java:33)
at OBSTclasses.Coordinator.main(Coordinator.java:102)
Java Result: 1
以及抛出此异常的行是:
minAverageTimeArray = new double[array.size()][array.size()];
感谢
答案 0 :(得分:3)
您必须增加Java VM的堆空间,请参阅此处:http://hausheer.osola.com/docs/5
答案 1 :(得分:3)
正如malfy's answer提到的,如果遇到OutOfMemoryError
,除了找到使用更少内存的方法之外,通过告诉JVM为堆分配更多内存来增加堆空间是一种方法处理这种情况。
通常,不应对Error
OutOfMemoryError
执行错误处理。与Error
相对的Exception
是JVM抛出的一个条件,它指出了一个对JVM致命的问题,这是一个无法真正“处理”的问题。程序本身。
来自Java API Specification for the Error
班级:
错误是Throwable的子类 这表明存在严重的问题 合理的申请不应该尝试 去抓。大多数此类错误都是 异常情况。
因此,为了简明扼要地回答这个问题,您不应该对OutOfMemoryError
进行错误处理,而应该找到避免首先发生Error
的方法。
答案 2 :(得分:2)
听起来你需要增加允许java进程使用的最大内存量。在java调用中添加-Xmx512m之类的参数,其中512m表示512兆字节。
答案 3 :(得分:0)
OutOfMemory错误的可能原因可能是内存泄漏 解: 使用以下命令
增加堆大小 Usage :: java -Xms<initial heap size> -Xmx<maximum heap size>
Defaults are:java -Xms32m -Xmx128m
Other values might be java -Xms128m -Xmx512m
-Xms - Initial Heap Size.
-Xmx - Extended(Maximum) Heap Size.
m-megabytes
答案 4 :(得分:0)
正如coobird所说,永远不会处理java中的错误。 您可以使用MAT(内存分析器 - http://www.eclipse.org/mat/)来检查您是否真的有任何内存泄漏,或者只是JVM的堆内存较少。在内存泄漏的情况下,您可以使用MAT的结果优化内存占用。另外,如上所述,许多朋友可以增加堆大小。
答案 5 :(得分:0)
是的,这是你的堆空间好吧。默认情况下,Java在大多数平台上为堆分配128MB。您应该考虑您愿意处理的列表的最大大小,以及您需要多少内存。这样考虑一下:Java中double类型的变量通常是8个字节长。如果您的列表长度为1024个项目,那么您的2D阵列将需要8 * 1024 * 1024字节或8MB的堆空间,仅用于阵列本身。现在,如果你的列表长度加倍,你需要四倍的堆(32MB),如果再加倍(4096项),你需要所有128MB的堆空间!当然,这忽略了程序创建的其他对象使用的所有堆。
所以,你有几个答案。正如其他人所说,最简单的方法是增加JVM实例将使用的最大堆。您还应考虑在任何时候减少程序所需的内存量。您是否可以计算中间总结或平均值而无需存储所有数据?或者您是否可以消除将数据存储为列表和数组的需要?你能降低数据的精确度 - 浮点数或整数是否与你的应用程序的双精度一样准确?