2009-08-27 3 views
2

나는 하위 양식이있는 MDI입니다. 자식 폼에는 DataGridView이 있습니다. DataGrid보기에서 엄청난 양의 데이터를로드합니다. 나는 아이가 폐기 방법이라고 형성 닫을 때 나는 메모리가 내려 가지 않는 양식을 닫을 때하는 내가 DataGridView에.NET 메모리 누출?

this.dataGrid.Dispose(); 
    this.dataGrid = null; 

을 폐기하십시오. 나는 .NET memory profiler을 사용하여 메모리 사용을 추적한다. 나는 처음에 데이터 그리드를로드 할 때 (예상대로) 메모리 사용량이 높아지고로드가 완료되면 상수가된다.

양식을 닫으면 여전히 일정합니다. 그러나 메모리 프로파일 러를 사용하여 메모리의 스냅 샷을 찍으면 파일을로드하기 전에 어떤 모습으로 바뀌게됩니다. 메모리 스냅 샷을 작성하면 강제로 가비지 수집기가 실행됩니다.

무슨 일입니까? 메모리 누수가 있습니까? 아니면 가비지 컬렉터를 강제 실행해야합니까?

더 많은 정보 :

내가 더 이상 정보가 필요없는 양식을 폐쇄하고있다. 그래서 나는 데이터에 대한 언급을하지 않고있다.

업데이트

그것은 나에게 한 번에 모든 데이터를로드하기위한 요구 사항입니다. 메모리 사용량이 너무 많아서 많은 데이터가있을 때 뭔가 잘못하고 가비지 컬렉터가 실행되고 있지 않은지 궁금해합니다. 그러나 프로파일 러를 보면 다른 프로세스가 스냅 샷은 메모리 사용량이 감소합니다. 그래서 나는 무슨 일이 일어나고 있는지 이해할 수 없다.

+0

어디에서/어떤 종류의 개체에 바인딩중인 데이터를로드하고 있습니까? – RichardOD

+0

DataView에 바인딩하고 있습니다. –

답변

-2

이 메모리 누수를 추적하는 데 유용한 도구입니다 :

SysInternals Process Explorer

+0

-1 .NET 메모리 프로파일 러 (OP가 현재 사용중인 기능)가 관리 코드에서 메모리 누수를 찾는 데 훨씬 좋습니다. – Niki

5

이것은 정상입니다. 가비지 컬렉터는 필요에 따라 자체 시간에 실행됩니다. 가비지 컬렉터가 강제 될 때 정상으로 돌아온다는 사실은 주변에 물건을 보관하는 누수 또는 영구 참조가 없음을 의미합니다.

실제 질문은 다음과 같습니다. 가비지 수집기를 실행해야합니까? 실제로 사용하는 것보다 많은 RAM을 사용하고 있습니까? 그렇지 않다면, 은 실제로과 관련이 있습니다. 다른 RAM이 필요하지 않은 물리 RAM을 사용한다면 문제가 될 것입니까?

또 다른 좋은 질문은 실제로 응용 프로그램에 데이터를 모두로드해야합니까? 그러나 더 많은 정보 없이는 대답 할 방법이 없습니다.

2

참조를 null로 설정했기 때문에 가비지 수집이 발생하지 않습니다. 당신이 더 이상 참조를하지 않으면 그것은 어느 시점에서 수집 될 것입니다. 잠시 동안 아직도 주변에 있기 때문에 메모리 누수가있는 것은 아닙니다. 또한 가비지 수집을 수행하더라도 메모리가 반드시 OS로 릴리스되는 것은 아니므로 응용 프로그램의 메모리 사용량이 줄어들지는 않습니다.

6

변수를 null으로 설정해도 가비지 수집기가 불가피하게 실행되지는 않습니다. GC는 비용이 많이 드는 과정이므로 절대적으로 필요한 경우를 제외하고는 피해야합니다. 따라서 콜렉터는 일정이 잡혀 있거나 필요할 때만 실행됩니다.매튜 Scharley가 언급 한 바와 같이,

this.dataGrid.Dispose(); 
this.dataGrid = null; 
GC.Collect(); 

그러나 정말 CLR 경우 문제가 않습니다 : 당신이 정말 메모리가 해제되어 있는지 확인해야 할 경우 당신은 당신의 데이터 그리드를 널링 한 후

, 수동으로 가비지 컬렉터를 호출 그 기억을 붙잡고 있니? 강제로 해제하면 DataGrid가 채워진 다음에 CLR에서 동일한 양의 메모리를 다시 할당해야합니다. 이는 느립니다.

DataGrid가 컴퓨터의 물리적 메모리와 비슷하거나 그 이상을 소비하지 않는 한 CLR 만 남겨 두십시오. 메모리 관리와 관련하여 가장 잘 알고 있습니다.

+1

다른 점은 메모리를 계속 유지하더라도 아무 것도 언급하지 않으면 GC가 실행되어 수집 될 때까지 결국 페이지 아웃되어 하드 드라이브에 앉아있게됩니다. –

-1

GC.WaitForPendingFinalizers(); - 그게 도움이되었습니다.