如何通过检查堆状态来防止OutOfMemoryError

时间:2013-03-09 15:30:59

标签: android

我认为检查Runtime.getRuntime().freeMemory()会这样做,但以下测试似乎表明它没用:

List<Byte> listDebug = new ArrayList<Byte>();
Log.d("Free memory", String.format("%1$.2f", (float)Runtime.getRuntime().freeMemory()/(1024*1024)));
for (int i = 0; i < 100; i++) {
    try {
        listDebug.addAll(Arrays.asList(new Byte[1024 * 100]));
        Log.d("Free memory", i + ":" + String.format("%1$.2f", (float)Runtime.getRuntime().freeMemory()/(1024*1024)));
    } catch (Exception ex) {
        Log.d("Free memory", ex.getMessage());
    }
    catch (Error e)
    {
        Log.d("Free memory", e.getMessage());
    }
}

输出如下:

03-09 03:16:11.267: D/Free memory(3860): 1.30
03-09 03:16:11.277: D/Free memory(3860): 0:1.25
03-09 03:16:11.287: D/Free memory(3860): 1:2.63
03-09 03:16:11.298: D/Free memory(3860): 2:3.86
03-09 03:16:11.298: D/Free memory(3860): 3:3.08
03-09 03:16:11.317: D/Free memory(3860): 4:4.85
03-09 03:16:11.317: D/Free memory(3860): 5:4.06
03-09 03:16:11.317: D/Free memory(3860): 6:3.28
03-09 03:16:11.367: D/Free memory(3860): 7:7.84
03-09 03:16:11.367: D/Free memory(3860): 8:7.06
03-09 03:16:11.367: D/Free memory(3860): 9:6.27
03-09 03:16:11.387: D/Free memory(3860): 10:7.84

freeMemory()返回最高数字时,测试应用程序在将列表展开11次后崩溃。我很困惑。我的测试代码是否存在根本缺陷或freeMemory()java.lang.OutOfMemoryError完全无关?

1 个答案:

答案 0 :(得分:2)

简短的回答是,这有点无关紧要。 javadoc说:

  

<强>返回

     

近似可用内存量,以字节为单位。

还有一些关于SO的其他问题更详细地解决了这个问题:

您可以尝试使用具有一定误差范围的值(例如,将85%的内存使用量视为没有空闲内存),但最好的方法是在发生OutOfMemoryError时调整行为并调整行为相应地(使用内存密集度较低的方法重启进程,从内存中清除其他内容并重试相同的进程,完全跳过进程,提醒用户,放弃等等。)