'捕获'OutOfMemoryError完全解决了内存不足的问题?

时间:2013-06-22 12:56:37

标签: java android try-catch out-of-memory

我在LogCat中收到 OutOfMemoryError 消息,我的应用程序崩溃,因为错误未被捕获。

导致 OutOfMemoryError 的两件事:
1.将大文本文件读入字符串 2.将该字符串发送到我的TextView。

简单地为这两件事添加一个捕获不仅捕获 OutOfMemoryError ,而且似乎完全解决了内存不足问题。
LogCat中没有更多崩溃,也没有更多错误消息。该应用程序运行完美。

这怎么可能?究竟发生了什么?


使用此代码,我收到错误消息&应用程序崩溃:

try
{
myString = new Scanner(new File(myFilePath)).useDelimiter("\\A").next();
} 
catch (FileNotFoundException e) 
{
e.printStackTrace();
}


myTextView.setText(myString);



只需“捕获” OutOfMemoryError ,LogCat中不再有错误消息而且没有崩溃:

try
{
myString = new Scanner(new File(myFilePath)).useDelimiter("\\A").next();
} 
catch (FileNotFoundException e) 
{
e.printStackTrace();
}
catch(OutOfMemoryError e)
{
}


try 
{
myTextView.setText(myString);
} 
catch(OutOfMemoryError e)
{
}

3 个答案:

答案 0 :(得分:2)

我猜你的字符串没有被完全加载,或者即使它是(它可能在添加文本之后就抛出错误),会发生什么取决于你的应用程序可用的当前内存如此捕获{{1}这不是可行的解决方案。

如果你真的想加载一个大的字符串文件并在OutOfMemoryError中显示,我建议你只加载文件的一小部分(比如说50kB),然后实现一些分页,就像一个加载下一个50kB的按钮。当用户滚动EditText时,您还可以加载其他行。

答案 1 :(得分:1)

如果你捕获OutOfMemoryError,垃圾收集器会尝试释放以前使用的内存,因此如果应用程序让垃圾收集器完成它的工作,应用程序可以继续(即应用程序不再引用那个大的你的一串)。

然而,捕获OutOfMemoryError远非万无一失。请参阅Catching java.lang.OutOfMemoryError?

答案 2 :(得分:1)

当您捕获异常时,JVM会尝试通过调用垃圾收集器并抓取不再使用的对象来从中恢复。

这可能会解决您案件中的问题。但是想象一下,问题的出现是因为代码中的编码和内存泄漏都很糟糕。捕获不会解决问题,因为GC不会收集任何对象。 GC将更频繁地启动,应用程序的性能将下降,直到它变得无法使用。

基本上,当JVM无法在堆上为新对象分配更多内存时,会发生此错误。捕获异常并让GC清理并释放内存可能是一种解决方案,但您绝不确定自己处于可恢复状态。我会使用catch块从错误中恢复,记录它并关闭应用程序。如果要在这种情况下解决内存问题,请正确执行并使用更多内存初始化JVM(使用java参数-Xmx