2013-07-10 5 views
3

C#을 사용하여 더 이상 참조하지 않고 메모리에있는 큰 구조체의 메모리를 확보하지 못했습니다.C# GC가 메모리를 해제하지 않습니다.

내가 가지고있는 문제와 비슷한 문제를 보여주는 아래 코드를 몇 개 포함했습니다. 왜 다음 코드가 Out of Memory Exception을 던질 지 확신 할 수 없기 때문에 GC에 대해 오해하고 있어야한다고 생각합니다.

내가 포함시킨 코드가 메모리를 낭비하는 이유를 아는 사람이 있습니까? 목록을 보유하고 있지 않으며 즉시 정리할 수 있습니다.

감사합니다,

생식 : 새로운 4.5 콘솔 응용 프로그램은 홈페이지에 코드를 붙여 넣습니다.

for 루프의 첫 번째 반복에서 세 번째 "새 목록"에 예외가 발생합니다. for 루프를 생략하면 OOM이 발생하지 않습니다.

for (var i = 0; i < 100; i++) 
{ 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
} 
+0

실제 프로그램에서 GC를 사용하고 있습니까? 가능하다면 프로그램이 자체 GC를 수행하도록 허용해야합니다. – Sayse

+0

제 생각에는 여기에 대한 의견이 있습니다 만, 세분화 된 메모리 관리 및 GC를 많이해야하는 경우 C#이 작업에 적합한 도구가 아닐 수도 있습니다. C/C++ 같은 것이 더 적합 할 수도 있습니다. 이 두 줄 중 예외를 throw하는 줄은 무엇입니까? – Gray

+0

첫 번째 또는 다른 것? –

답변

2

확인이 재현하지만 다음과 같은 조건에서 않습니다

  • FX는 4.5, 플랫폼 = 모든 CPU, 구성 = 디버그.

x64 플랫폼 또는 릴리스 모드를 선택하면 프로그램이 예상대로 실행됩니다.

따라서 잠정적 인 결론 : 최적화를하지 않으면 List<>은 뿌리 내리지 않아야합니다. 따라서 GC 호출은 전혀 영향을 미치지 않으며 x86 메모리 공간이 빨리 소모됩니다.

이것은 버그 일 수도 있고 디버깅을 목적으로 한 '기능'일 수도 있습니다.

그러나 문제가있는 것처럼 보이지만 매우 쉽게 피할 수 있습니다.

+0

아쉽게도 릴리스 모드를 선택해도 여전히 오류가 발생합니다. – skippy10110

+0

[] 최적화가 선택되어 있습니까? –

+0

이것이 실제로 디버깅과 관련된 "기능"이지만 100 % 확실하지는 않습니다.나는 그저 오래 전에 예전과 비슷한 것을 설명했다는 사실을 기억하고있는 위대한 SO 대답을 읽었습니다. 실제로 그것을 찾으려고 노력할 것입니다. (실제로 처음에는 대답을 썼다고 생각했습니다. 아마도 아닙니다.) 물론 OP가 정확하고 최적화 된 빌드에서 발생합니다 ... 이것은 잘못된 것입니다. –

관련 문제