try/catch 블록을 사용하여 OutOfMemoryException
을 잡을 수 있다는 사실을 조금 혼란스럽게 생각합니다.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();
}
이 때문에 StackOverflowException
,에 OutOfMemoryException
10 배를 출력하고 종료하는 그것은 처리 할 수 없습니다.
램 그래프 모양처럼 그 프로그램을 실행하는 동안 :
내 질문 지금 왜 우리가 OutOfMemoryException
을 잡을 수 있습니까? 잡으면 우리가 원하는 코드를 실행할 수 있습니다. RAM 그래프에 의해 입증 된 바와 같이, 메모리가 릴리스되었습니다. 런타임은 어떤 객체를 GC 할 수 있는지, 그리고 계속 실행하려면 어떤 객체를 필요로하는지 어떻게 알 수 있습니까?
OutOfMemory() 메소드를 보여주세요. 내가 할당 한 메모리에 대한 참조를 유지하지 않을 것이므로 GC는 반환 한 후에 GC가이를 해제 할 수 있습니다. –
done, you 're right – GameScripting
그래, OutOfMemory()가 던지 자마자 할당 된 모든 메모리는 GC에 의해 해제 될 수 있습니다. –