온라인 및 개인 테스트에서 배웠 듯이 양식의 종결 자 (System.Windows.Forms.Form)는 GC에 의해 호출되지 않습니다. Form GC.SuppressFinalize()의 Dispose() 내부에서 파이널 라이저가 다시 호출되지 않도록 호출됩니다.winform이 가비지 수집되었는지 어떻게 확인합니까?
Exapmle :
public partial class UpdateForm : Form
{
public UpdateForm()
{
InitializeComponent();
// Listen to the event of some model
Database.OnDataUpdated += new EventHandler(DataBase_OnDataUpdated);
}
~UpdateForm()
{
// Never gets called.
}
private void DataBase_OnDataUpdated(object sender, EventArgs e)
{
// Update data on this form
}
}
그러나 방송 위의 예로서, 만약 폼 커넥트 일부 모델 (+ =)는 이벤트와 분리되지 않는다 - 폐기에 (=) 이벤트() Dispose()가 호출 되더라도 양식은 결코 가비지 수집되지 않습니다. 그런 다음
int[] dummyArray = new int[1024 * 1024 * 128]; // Comsume 128MB memory
내가의 메모리 프로필을보고 :
내가 양식 수집 된 쓰레기가 정말 있는지 확인하기 위해 할 것은 내가 다음과 같이 메모리를 많이 소비하는 형태로 내부에 큰 배열을 만들 것입니다 Windows의 작업 관리자에서 양식을 삭제 한 후 GC.Collect()를 호출 할 때 메모리 사용량이 감소되었는지 확인하십시오.
내 방법이 현명하지 않습니다. 다른 스마트 한 방법이나 양식이 실제로 가비지 수집되는 것을 확인하는 도구가 있는지 궁금합니다. 감사.
finalizer가 호출되지 않아도 양식에 여전히 가비지 수집됩니다. 그런데 파이널 라이저를 왜 부르겠습니까? 파이널 라이저에 넣을 수있는 것은'Dispose' 메소드에 넣지 말아야 할 사항입니까? – hvd
혼란스러운 죄송합니다. 파이널 라이저가 호출되기를 원하는 것은 아닙니다. 양식이 가비지 수집되었는지 확인하고 싶습니다. 즉 양식에서 사용하는 모든 메모리가 해제되어야합니다. 나는 보통 객체가 가비지 컬 렉트인지 여부를 확인하기 위해 파이널 라이저 (finalizer)를 사용한다. – Paul20