内容简介:GC对程序中使用的引用进行分析,并可以丢弃任何不在任何地方使用的对象.OutOfMemoryException并不意味着内存已经完全耗尽,只是意味着内存分配失败.如果您尝试一次分配一个大内存区域,那么仍然可能会有大量可用内存.当没有足够的可用内存进行分配时,系统会执行垃圾回收以尝试释放内存.如果仍然没有足够的内存分配,它将抛出异常.
我有点困惑,我们可以使用try / catch块捕获OutOfMemoryException.
给出以下代码:
Console.WriteLine("Starting"); for (int i = 0; i < 10; i++) { try { OutOfMemory(); } catch (Exception exception) { Console.WriteLine(exception.ToString()); } } try { StackOverflow(); } catch (Exception exception) { Console.WriteLine(exception.ToString()); } Console.WriteLine("Done");
我用来创建OutOfMemory StackOverflowException的方法:
public static void OutOfMemory() { List<byte[]> data = new List<byte[]>(1500); while (true) { byte[] buffer = new byte[int.MaxValue / 2]; for (int i = 0; i < buffer.Length; i++) { buffer[i] = 255; } data.Add(buffer); } } static void StackOverflow() { StackOverflow(); }
它打印出OutOfMemoryException 10次,然后由于StackOverflowException终止,它不能处理.
执行该程序时,RAM图表如下所示:
现在我的问题是为什么我们能够捕获OutOfMemoryException?抓住它之后,我们可以继续执行我们想要的任何代码.正如RAM图所证明的那样,内存被释放.运行时如何知道GC可以使用哪些对象以及哪些仍然需要进一步执行?
GC对程序中使用的引用进行分析,并可以丢弃任何不在任何地方使用的对象.
OutOfMemoryException并不意味着内存已经完全耗尽,只是意味着内存分配失败.如果您尝试一次分配一个大内存区域,那么仍然可能会有大量可用内存.
当没有足够的可用内存进行分配时,系统会执行垃圾回收以尝试释放内存.如果仍然没有足够的内存分配,它将抛出异常.
StackOverflowException不可能处理,因为这意味着堆栈已满,并且不可能像堆栈一样从其中删除任何东西.您将需要更多堆栈空间来继续运行处理异常的代码,但没有更多.
http://stackoverflow.com/questions/13835778/how-does-catching-an-outofmemoryexception-work
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- js捕获错误信息
- Python捕获所有异常
- Android NativeCrash 捕获与解析
- Wireshark如何捕获USB流量
- 在 Docker 容器中捕获信号
- Laravel异常:捕获,处理和创建
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。