> 백엔드 개발 > C#.Net 튜토리얼 > C# 메모리 부족예외

C# 메모리 부족예외

王林
풀어 주다: 2024-09-03 15:21:13
원래의
823명이 탐색했습니다.

C#의 OutOfMemoryException은 프로그램 실행을 계속하기에 충분한 메모리가 없을 때 .NET 프레임워크 실행 엔진에서 발생하는 예외입니다. 이름에서 알 수 있듯이 이 예외는 CLR, 즉 공용 언어 런타임이 프로그램의 특정 작업을 수행하는 데 필요한 충분한 메모리를 할당할 수 없을 때 프로그램에서 발생합니다.

이 예외는 항상 메모리에 사용 가능한 공간이 충분하지 않다는 의미는 아니지만 때로는 프로그램 할당에 필요한 연속 메모리가 충분하지 않음을 의미합니다.

구문

C#에서 OutOfMemoryException을 catch하는 구문은 다음과 같습니다.

try
{
//user code which can throw OutOfMemoryException
}
catch(OutOfMemoryException <em>exception</em>)
{
//statements to handle the exception
}
로그인 후 복사

C#에서 OutOfMemoryException을 발생시키는 구문은 다음과 같습니다.

throw new OutOfMemoryException();
로그인 후 복사

위 문장에서 'throw'는 C#에서 예외를 발생시키는 데 사용되는 키워드입니다.

C#에서 OutOfMemoryException이 어떻게 작동하나요?

C#에서는 프로그램 실행을 계속할 공간이 충분하지 않으면 OutOfMemoryException이 발생합니다. 이 예외가 발생하는 데는 여러 가지 이유가 있을 수 있습니다. 또한 프로그램을 실행할 충분한 공간이 있지만 이 공간이 프로그램에서 수행하는 데 필요한 할당에 연속되지 않는 경우에도 이 예외가 발생합니다. 이 예외가 발생하는 두 가지 주요 이유는 다음과 같습니다.

StringBuilder의 MaxCapacity 속성에 지정된 길이 이상으로 StringBuilder 개체의 길이를 늘리려고 합니다.

"메모리가 부족하여 프로그램을 계속 실행할 수 없습니다."라는 예외가 발생합니다.

  • 메모리 할당이 필요한 메서드를 할당하거나 호출하는 동시에 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# 메모리 부족예외

예시 #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# 메모리 부족예외

C#에서 OutOfMemoryException을 방지하는 방법은 무엇입니까?

다음 사항을 염두에 두면 C#에서 OutOfMemoryException을 피할 수 있습니다.

  • StringBuilder로 작업하는 동안 이 예외를 방지하려면 생성자 StringBuilder.StringBuilder(Int32, Int32)를 호출하고 MaxCapacity 속성을 해당 StringBuilder를 확장할 때 필요한 편의를 제공할 만큼 큰 값으로 설정할 수 있습니다. 개체입니다.
  • 32비트 시스템에서 작업하는 동안 이 예외를 방지하려면 아래 단계에 따라 Visual Studio에서 애플리케이션을 32비트에서 64비트 시스템으로 다시 컴파일할 수 있습니다.
  1. 메뉴바 -> 빌드 -> 구성 관리자
  2. Active Solution Platform 목록을 클릭하고 64비트 플랫폼을 선택한 후 닫기 버튼을 클릭하세요.
  3. 목록에서 64비트 플랫폼을 사용할 수 없는 경우:

    • 목록에서 새 옵션을 클릭하세요
    • 새 솔루션 플랫폼 창에서 '새 플랫폼 입력 또는 선택' 목록을 클릭한 후 'x64' 옵션을 선택하세요.
    • 확인 버튼을 클릭하세요.
    • 관리되지 않는 리소스로 작업하는 동안 이 예외가 발생하지 않도록 하려면 더 이상 필요하지 않은 관리되지 않는 리소스로 작업을 완료한 후 항상 Dispose() 메서드를 호출해야 합니다.
    • 대규모 데이터 세트로 작업하는 동안 이러한 예외를 방지하려면 데이터를 필터링한 다음 처리에 필요한 데이터만 전달해야 합니다.
    • 큰 문자열로 작업하거나 큰 문자열 연결을 수행하는 동안 이 예외를 방지하려면 문자열 대신 StringBuilder를 사용할 수 있습니다. StringBuilder는 변경 가능하고 작업을 수행할 때 문자열의 새 인스턴스를 생성하지 않기 때문입니다.

    결론

    OutOfMemoryException은 메모리가 부족하거나 C# 프로그램에 필요한 할당을 위한 연속 메모리가 부족함을 프로그래머에게 알리는 런타임 예외입니다.

    이 예외를 방지하려면 사용자는 항상 필요한 예방 조치를 취하고 이 예외를 처리해야 합니다.

    위 내용은 C# 메모리 부족예외의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿