.NET 프레임 워크는 OutOfMemoryException에 메모리를 어떻게 할당합니까?


144

C ++에서는 실제로 힙에 메모리를 할당하지 않고 값으로 예외를 throw 할 수 있으므로이 상황이 적합합니다. 그러나 .NET 프레임 워크 OutOfMemoryException에서는 참조 유형이므로 힙에 할당됩니다. .NET Framework OutOfMemoryException는 메모리가 부족하여 새 개체를 만들 때 어떻게 메모리를 할당 합니까?


6
훌륭한 질문입니다. 아마도 그 상황을 위해 충분한 메모리가 예약되어있을 것입니다.
GreatAndPowerfulOz

19
이미 다른 답변에 추가하기 위해 OOM은 요청한 블록을 할당 할 수 없음을 의미합니다. 100Mb를 요청하고 런타임에서 찾을 수있는 가장 큰 사용 가능한 블록이 99Mb 인 경우 실패합니다. 그러나 OOM 예외는 몇 바이트의 메모리 만 필요합니다. 따라서 할당이 실패했다고해서 메모리가 0으로 남아있는 것은 아닙니다. 그러나 물론 런타임은이 상황에서 스스로를 커버하기 위해 약간의 메모리를 예약 할 수 있습니다.
Jason Williams

4
그런데 C ++에 대한 가정은 틀렸다. 컴파일러에 따라 예외가 힙에 할당 될 수 있습니다. MS 컴파일러는 공통 C ++ ABI에서는 그렇지 않지만 힙에 공간이 없으면 대신 사용되는 사전 할당 된 작은 비상 버퍼가 있다는 점을 제외하고 힙에 예외가 할당됩니다.
Sebastian Redl

답변:


163

런타임에 의해 사전 할당됩니다. 관리되는 프로세스의 힙을 탐색하면 해당 예외의 인스턴스를 찾을 수 있습니다.

Hello World 앱에서 미리 할당 된 예외는 다음과 같습니다.

0:003> !dumpheap -stat -type Exception
Statistics:
      MT    Count    TotalSize Class Name
735f2920        1           84 System.ExecutionEngineException
735f28dc        1           84 System.StackOverflowException
735f2898        1           84 System.OutOfMemoryException
735f2744        1           84 System.Exception
735f2964        2          168 System.Threading.ThreadAbortException

4
그러나의 생성자OutOfMemoryException 가 호출됩니다.
Tim Schmelter

36
런타임은 코드와 동일한 규칙으로 재생할 필요가 없습니다. 또 다른 예는 던질 경우 StackOverflowException잡을 수 있지만 런타임에서 해당 예외를 던지면 기본적으로 잡을 수 없다는 것입니다.
Brian Rasmussen

8
CLR의 기본 메커니즘의 대부분은 실제로 "C"및 "C ++"로 작성됩니다. 따라서 객체가 "새 위치에"있거나 메모리가 다르게 조작 될 수 있습니다.
GreatAndPowerfulOz

2
@hvd 부작용은 무엇입니까? OOM은 스택 추적을 제공합니까? 나머지 정보는 상당히 정적인가?
James Barrass

7
두 개의 스레드가 동시에 그들을 던져서 같은 유형의 예외가 두 개 필요한 경우 어떻게됩니까?
Traubenfuchs

42

런타임 내에 메모리 부족 조건이 발생하면 ThrowOutOfMemory를 호출 합니다 . Exception :: GetOOMException을 호출 하여 스택에 객체를 생성 한 다음 정적으로 할당 된 전역 인스턴스에 복사 한 다음 throw합니다.

이것은 관리되는 예외는 아니지만 ex.h에 선언 된 C ++ 예외 입니다. C ++ 예외는 clrex.cpp의 관리 예외로 변환 되는데 , 여기에는 원래 appdomain.cpp에 할당되고 생성 된 사전 할당 관리 OutOfMemoryException 을 구체적으로 발생시키는 코드가 포함 되어 있습니다 .

참고 :이 소스 파일 중 일부는 커서 강조 표시를로드하는 동안 몇 초 동안 브라우저를 정지시킬 수 있습니다.

Tim Schmelter가 다른 답변에 대한 주석에서 링크 한 호출 사이트는 메모리 부족 및 개체 생성이 불가능한 런타임과 관련이 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.