如何检查数组是否可以在 java 中分配请求的内存大小?
How can I check if an array can be allocated requested memory size in java?
我正在 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)的内存限制。
有两种方法。首先是您可以使用 Runtime(.getRuntime()).freeMemory() 来获取可用内存的大小。您的数组将是 sizeof(int)(即 4)* 2^whatever。所以你可以检查一下。我不知道从哪里可以获得 VM 数组大小限制(信息可能在某处可用,或者可以通过测试获得)但是你可以用这个做类似的事情。
另一种(更简单的)方法是将其放入 try {} catch 块中,并捕获错误。一般来说,不建议捕获Error,但在这种情况下可能有点意义。
我认为您正在寻找的答案是 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?
}
我正在 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)的内存限制。
有两种方法。首先是您可以使用 Runtime(.getRuntime()).freeMemory() 来获取可用内存的大小。您的数组将是 sizeof(int)(即 4)* 2^whatever。所以你可以检查一下。我不知道从哪里可以获得 VM 数组大小限制(信息可能在某处可用,或者可以通过测试获得)但是你可以用这个做类似的事情。
另一种(更简单的)方法是将其放入 try {} catch 块中,并捕获错误。一般来说,不建议捕获Error,但在这种情况下可能有点意义。
我认为您正在寻找的答案是 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?
}