c# – 捕获OutOfMemoryException是如何工作的?

栏目: C# · 发布时间: 6年前

内容简介: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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

郎咸平说:新经济颠覆了什么

郎咸平说:新经济颠覆了什么

郎咸平 / 东方出版社 / 2016-8 / 39.00元

正所谓“上帝欲其灭亡,必先令其疯狂”,在当下中国,“互联网+资本催化”的新经济引擎高速运转,大有碾压一切、颠覆一切之势。在新经济狂热之下,每个人都在全力以赴寻找“下一个风口”,幻想成为下一只飞起来的猪。 对此,一向以“危机论”著称的郎咸平教授再次发出盛世危言:新经济光环背后,危机已悄然而至!中国式O2O还能烧多久?P2P监管黑洞有多大?互联网造车为什么不靠谱?共享经济为什么徒有虚名?BAT为......一起来看看 《郎咸平说:新经济颠覆了什么》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具