컨테이너 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());
}
참조가 사라지 자마자 GC는 메모리를 해제 할 의무가 없습니다. 그렇게하면 응용 프로그램의 수명 동안 절대로 필요할 수도 있다고 판단되면 메모리가 해제됩니다. – Ryan
CLR 프로파일 러를 사용하는 경우 GC 검색의 RefType 객체가 루트 참조를 가질 때마다 생성을 촉진하기 때문에 '왜이 메모리를 회수하지 않는가?'를 볼 수 있습니다. 객체가 릴리즈/파기 할 루트 참조가 없다는 것을 감지해야합니다. 실제로 객체를 삭제 한 다음 부활하여 다시 릴리스합니다. 제프는 그 사람입니다 : http://msdn.microsoft.com/en-us/magazine/bb985011.aspx –