내 업무에서 OutOfMemoryExceptions에 문제가있었습니다. 나는 어떤 행동을 모방하기위한 간단한 코드를 작성했으며, 나는 다음과 같은 수수께끼로 끝을 맺었다. 메모리가 부족할 때 폭발하는이 간단한 코드를보십시오..NET 가비지 수집기의 신비
//...
for (;;iter++)
{
list.Add(new byte[10000]);
if (iter % 1000 == 0)
GC.Collect();
}
//...
그리고 놀라운 :
class Program
{
private static void Main()
{
List<byte[]> list = new List<byte[]>(200000);
int iter = 0;
try
{
for (;;iter++)
{
list.Add(new byte[10000]);
}
}
catch (OutOfMemoryException)
{
Console.WriteLine("Iterations: " + iter);
}
}
}
내 컴퓨터에 그것은 그럼 난 각각의 천 반복 한 후 루프에 GC.Collect
전화를 추가
Iterations: 148008
으로 돌아가 셨습니다
Iterations: 172048
각 10 회 반복 후에 GC.Collect
을 호출했을 때 나는 심지어 193716 사이클을 얻었습니다.
어떻게
GC.Collect
에 수동 호출 (더 할당 30 %까지)와 같은 심각한 영향을 미칠 수있다 :이 이상한 일들이 있습니까?"손실 된"참조가없는 경우 GC 목록을 수집 할 수 있습니까?
흥미로운 질문입니다. 나는 그것이 메모리 공간의 조각 모음과 관련이 있다고 생각할 것이다. GC.Collect를 자주 호출하면 인접한 블록을 더 크게 유지할 수 있으므로 나중에 예외가 발생한다. 그러나 그것은 단지 야생의 추측이며 다른 사람들의 의견을 기다리고 있습니다. – Lucero
나는 당신에게 질문에 답할 수는 없지만 2)에서는 "추가"방법을 조사 할 수 없기 때문에 잃어버린 참조가 없다고 말할 수 없다. – flq
@ 프랭크 : 그건 당연한 얘기지만, 평범한 배열을 사용해 보았는데 그 결과는 같았습니다. – Elephantik