我在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)发生变化的内存限制。
答案 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块中,并捕获错误。一般来说,不建议捕获错误,但在这种情况下它可能会有所帮助。