如何检查数组是否可以在java中分配请求的内存大小?

时间:2015-10-26 20:23:45

标签: java arrays memory out-of-memory

我在java中编写代码,其中整数类型变量m从用户接收其值,该值用于为数组分配内存(指数)。

例如:

int m=29;
int [] c = new int [(int)pow(2,m)];

我的问题是 如何在实际分配之前检查是否可以根据上面的代码分配内存,如果由于

而无法向用户抛出异常
java.lang.OutOfMemoryError: Java heap space

或由于

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

此外,我想知道如何克服内存要求在程序中以指数方式(例如2 ^ m)发生变化的内存限制。

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的答案是Runtime.freeMemory() - http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#freeMemory()

在某些情况下,将解决方案扩展到可用内存可能会有所帮助。但是,在实践中,您仍然希望将内存调用包装在try-catch中,如:

int m=29;
int [] c = null;
try {
  c = new int [(int)pow(2,m)];
} catch(OutOfMemoryError e) {
  //Try with less memory?
  //Other error handling?
}

答案 1 :(得分:0)

有两种方法。首先,您可以使用Runtime(.getRuntime())。freeMemory()来获取可用内存的大小。你的数组将是sizeof(int)(即4)* 2 ^无论如何。所以你可以检查一下。我不知道你可以在哪里获得VM数组大小限制(信息可能在某处可用,或者可以通过测试获得)但你可以做类似的事情。

另一种(更简单的)方法是将它放在try {} catch块中,并捕获错误。一般来说,不建议捕获错误,但在这种情况下它可能会有所帮助。