首页  >  文章  >  后端开发  >  C# OutOfMemoryException

C# OutOfMemoryException

王林
王林原创
2024-09-03 15:21:13777浏览

C#中的OutOfMemoryException是.NET框架执行引擎在程序没有足够内存继续执行时抛出的异常。顾名思义,当 CLR(即公共语言运行时)无法分配执行程序的某些操作所需的足够内存时,我们的程序中就会出现此异常。

此异常并不总是意味着我们没有足够的可用内存空间,但有时这意味着我们没有足够的程序分配所需的连续内存。

语法

C# 中捕获 OutOfMemoryException 的语法如下:

try
{
//user code which can throw OutOfMemoryException
}
catch(OutOfMemoryException <em>exception</em>)
{
//statements to handle the exception
}

C# 中抛出 OutOfMemoryException 的语法如下:

throw new OutOfMemoryException();

上面的语句中,'throw'是C#中用于抛出异常的关键字。

OutOfMemoryException 在 C# 中如何工作?

在 C# 中,当我们的程序没有足够的空间来继续执行时,我们会得到 OutOfMemoryException。出现此异常的原因可能有很多。当我们总共有足够的空间供程序执行,但该空间对于程序所需完成的分配来说并不连续时,我们也会遇到此异常。造成此异常的两个主要原因如下:

尝试将 StringBuilder 对象的长度增加到超出 StringBuilder 的 MaxCapacity 属性指定的长度。

我们会收到异常“内存不足,无法继续执行程序。”

  • 当我们进行赋值或调用需要内存分配的方法时,同时 CLR 无法为我们的分配提供足够的连续内存,那么我们将得到 OutOfMemoryException。

可能导致此异常的其他原因包括:

  • 在只有 2GB 虚拟内存的 32 位系统上运行应用程序,因此 CLR 很难为应用程序所需的分配提供连续的内存。
  • 在使用文件处理程序、数据库连接、指针等非托管资源后,如果我们不处理这些资源,则会导致内存泄漏,从而降低应用程序的性能,并可能导致 OutOfMemoryException。
  • 处理大型数据集需要大量内存,如果 CLR 没有足够的连续可用空间,则会导致 OutOfMemoryException。
  • 由于字符串是不可变的,因此对字符串执行的操作会在内存中创建一个新字符串。因此,如果我们正在处理大型字符串,并且如果我们在字符串上重复执行串联操作,则可能会导致多次内存分配,从而降低应用程序的性能,并可能成为 OutOfMemoryException 的原因。
  • 如果我们在内存中固定了多个对象很长一段时间,那么垃圾收集器就很难为这些对象提供连续的内存分配。

示例

以下是下面提到的示例

示例#1

显示当我们尝试将 StringBuilder 对象扩展到超出其最大容量时程序抛出 OutOfMemoryException 的示例。

代码:

using System;
using System.Text;
public class Program
{
public static void Main()
{
StringBuilder stringBuilder = new StringBuilder(17, 17);
stringBuilder.Append("Welcome to the ");
try
{
stringBuilder.Insert(0, "world of C# programming", 1);
Console.WriteLine(stringBuilder.ToString());
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception.Message);
Console.ReadLine();
}
}
}

输出:

C# OutOfMemoryException

示例#2

示例显示程序在尝试向列表中添加元素时遇到 OutOfMemoryException,其中要添加的元素数量超过了列表的容量。

代码:

using System;
using System.Text;
using System.Collections.Generic;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
try
{
string[] strArray = GetArray();
Console.WriteLine(strArray);
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
public static string[] GetArray()
{
List<string> strList = new List<string>();
for (int i = 0; i <= int.MaxValue; i++)
{
strList.Add("Hello");
}
return strList.ToArray();
}
}
}

输出:

C# OutOfMemoryException

如何避免 C# 中的 OutOfMemoryException?

我们可以通过记住以下几点来避免 C# 中的 OutOfMemoryException:

  • 为了在使用 StringBuilder 时避免出现此异常,我们可以调用构造函数 StringBuilder.StringBuilder(Int32, Int32) 并将 MaxCapacity 属性设置为一个足够大的值,以便在扩展相应的 StringBuilder 时提供所需的空间对象。
  • 为了避免在 32 位系统上工作时出现此异常,我们可以通过以下步骤在 Visual Studio 中将应用程序从 32 位系统重新编译为 64 位系统:
  1. 菜单栏 ->构建->配置管理器
  2. 单击 Active Solution Platform 列表并选择 64 位平台,然后单击关闭按钮。

如果列表中没有 64 位平台,则:

  • 单击列表中的“新建”选项
  • 在“新解决方案平台”窗口中,单击“键入或选择新平台”列表,然后选择“x64”选项。
  • 单击“确定”按钮。
  • 为了避免在使用非托管资源时出现此异常,我们应该在完成对不再需要的非托管资源的处理后调用 Dispose() 方法。
  • 为了在处理大型数据集时避免出现此异常,我们应该尝试过滤数据,然后只传递所需的数据进行处理。
  • 为了在处理大字符串或执行大字符串连接时避免出现此异常,我们可以使用 StringBuilder 而不是 string,因为 StringBuilder 是可变的,并且当我们对其执行任何操作时不会创建字符串的新实例。

结论

OutOfMemoryException 是一个运行时异常,它告诉程序员没有足够的内存或缺少连续内存来分配 C# 程序所需的内存。

为了避免此异常,用户应始终采取必要的预防措施并处理此异常。

以上是C# OutOfMemoryException的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn