가비지 수집기는 사용자를 대신하여 메모리를 훌륭히 관리하며 사용하지 않는 객체를 효율적인
방식으로 제거한다. 하지만 이러한 작업이 아무리 효율적이라 하더라도힙에서 새로운 객체를
생성하고 삭제하는 작업은 그러한 일을 전혀 하지 않는 것에 비한다면 상대적으로 많은 프로세서
시간을 사용하는 것이 사실이며, 너무 많은 객체를 생성하면 심각한 성능 문제를 일으킬 수도 있다.
다라서 가비지 수집기가 과도하게 동작하지 않도록 주의해야 한다. 기술적으로 몇 가지만 유념하면
가비지 수집기의 작업을 현저하게 줄일 수 있다. 모든 참조 타입의 객체는 그것이 설사 지역 변수라
하더라도 동적으로 메모리를 할당한다. 이렇게 할당된 객체는 이 객체를 참조하는 상위 객체가
삭제되면 가비지가 된다. 지역변수의 경우그 변수를 선언한 메서드를 벗어나는 순간 가비지가 되어
더 이상 살아 있는 객체로 간주되지 않는다. 가장 흔히 저지르는 나쁜 예 중 하나로 윈도우의 Paint
이벤트 핸들러 내에서 GDI 객체를 할당하는 경우를 꼽을 수 있다.
protected override void OnPaint(PaintEventArgs e)
{
// 나쁜 예, Paint 이벤트가 발생할 때마다 동일한 폰트를 생성한다.
using (Font MyFont = new Font("Arial", 10.0f))
{
e.Graphics.DrawString(DateTime.Now.ToString()),
MyFont, Brushes.Black, new PointF(0, 0));
}
base.OnPaint(e);
}
OnPaint()는 매우 자주 호출되는 이벤트 핸들러 중 하나인데 이 예제에서는 이 이벤트 핸들러가
호출될 때마다 동일한 Font 객체를 매번 다시 생성한다. 가비지 수집기는 이렇게 생성된 객체를
제거할 책임이 있다. 가비지 수집 작업을 수행할지는 사용 중인 메모리 양과 메모리의 할당 주기를
기반으로 결정된다. 따라서 메모리 할당을 자주 반복하면 사용되는 메모리의 양이 많아져서 가비지
수집 작업이 수행될 가능성이 높아질 뿐 아니라 할당 주기가 짧기 때문에 가비지 수집 작업을 더
자주 수행할 가능성이 있다. 따라서 이와 같은 코드는 상당히 비효율적이다.