【问题标题】:How can I check if an array can be allocated requested memory size in java?java - 如何检查数组是否可以在java中分配请求的内存大小?
【发布时间】:2016-01-26 02:12:27
【问题描述】:

我正在用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)的内存限制。

【问题讨论】:

  • 把它包在 try/catch 中?
  • 提前计算必要的空间并与可用内存进行比较...
  • 除了 try/catch 之外的任何其他选项

标签: java arrays memory out-of-memory


【解决方案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?
}

【讨论】:

    【解决方案2】:

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

    另一种(更简单的)方法是将其放入 try {} 捕获块中,然后捕获错误。一般来说,不建议捕获错误,但在这种情况下,它可能会有些意义。

    【讨论】:

    • VM 阵列大小限制显示为 m>29。 Try/Catch 很容易,但正如您所说,不建议这样做,我也试图避免它。我要做的就是向用户抛出异常。
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2014-06-29
    • 1970-01-01
    • 2017-04-07
    • 2012-10-05
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多