内存不足错误

时间:2010-12-29 06:58:39

标签: java exception-handling

我编写了一个代码,我希望传递一些不同大小的列表,但是当我的列表大小超过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()];

感谢

6 个答案:

答案 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实例将使用的最大堆。您还应考虑在任何时候减少程序所需的内存量。您是否可以计算中间总结或平均值而无需存储所有数据?或者您是否可以消除将数据存储为列表和数组的需要?你能降低数据的精确度 - 浮点数或整数是否与你的应用程序的双精度一样准确?