2012-05-29 3 views
2

컨테이너 2 개의 폼이있는 중간 크기의 응용 프로그램이 있습니다. 응용 프로그램을 열면 첫 번째 양식으로 이동하고 약 17MB를 소모합니다. 그런 다음 두 번째 양식을 열고 첫 번째 양식을 닫습니다. 약 57MB가 소모됩니다. 나는 두 번째를 닫고 첫 번째 33MB를 다시 연다. 첫 번째를 닫고 두 번째, 66mb를 다시여십시오. 이 메모리가 왜 회수되지 않습니까? 다음은 현재 양식을 닫고 새 양식을 여는 데 사용하는 코드입니다. 가비지 수집기가 아직 수집하도록 선택하지 않았기 때문에 메모리가 회수되지 않을 경우닫힌 폼은 메모리를 해제하지 않습니다.

private void honButton_Click(object sender, EventArgs e) 
{ 
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc)); 

    this.Close(); 
    this.Dispose(); 

    t.Start(); 
} 


public static void ThreadProc() 
{ 
    Application.Run(new Form1()); 
} 
+3

참조가 사라지 자마자 GC는 메모리를 해제 할 의무가 없습니다. 그렇게하면 응용 프로그램의 수명 동안 절대로 필요할 수도 있다고 판단되면 메모리가 해제됩니다. – Ryan

+0

CLR 프로파일 러를 사용하는 경우 GC 검색의 RefType 객체가 루트 참조를 가질 때마다 생성을 촉진하기 때문에 '왜이 메모리를 회수하지 않는가?'를 볼 수 있습니다. 객체가 릴리즈/파기 할 루트 참조가 없다는 것을 감지해야합니다. 실제로 객체를 삭제 한 다음 부활하여 다시 릴리스합니다. 제프는 그 사람입니다 : http://msdn.microsoft.com/en-us/magazine/bb985011.aspx –

답변

1

, 그것은 아마.

GC는 .NET에서 결정적이지 않습니다.

사실 나는 프로세스에 사용 가능한 가상 주소 공간이 거의 다 소모 될 때까지 메모리 방출을 시작하지 않는 적극적인 메모리 할당 (매우 큰 데이터 구조 처리)을 작성했습니다.

GC 실행은 사용중인 가비지 수집기 (서버 대 워크 스테이션), .NET 구현 및 응용 프로그램의 메모리 사용 프로필에 따라 다릅니다.

0

프로파일 링 도구를 사용하여 메모리 사용량 또는 Windows 작업 관리자를 확인하고 있습니까? 작업 관리자는 응용 프로그램의 메모리 사용을 검사하기에 좋지 않습니다. 전용 바이트와 같은 것에 대해서는 perfmon의 프로세스 메트릭을 사용하십시오.

관련 문제