관리 메뉴

제목없음

.NET의 가비지 관리 체계 본문

프로그램 작성/기타

.NET의 가비지 관리 체계

다람군 2012.06.30 02:42

.NET Framework는 가비지 컬렉터를 지원하는 플랫폼입니다. Framework는 3단계로, Compact Framework는 1단계로 관리를 하지요. 사실 단계라는 말을 사용하지 않고 세대라는 말을 사용합니다.

특히 .NET Framework는 이 세대들을 객체를 얼마나 오래 사용하고 있었나로 분류합니다. 가장 짧게 사용한 객체들은 3세대에, 그 다음은 2세대에, 그리고 매우 오래 사용한 객체는 1세대에서 관리합니다.

가비지 컬렉터는 일정 주기로 가비지를 관리합니다. 3세대는 매우 빠른 주기로 가비지를 관리하며, 2세대는 그 다음, 마지막으로 1세대는 한번 관리되려면 3세대보다 매우 많은 시간을 기다려야 합니다.

보통 3세대에 머무는 객체는 지역 변수들입니다. 함수 내에서 한번 사용하고 소멸되는 객체들이지요. 물론 지역 변수만 있는건 아닙니다. 모든 객체는 생성되면 이 3세대에 먼저 머물게 되니까요.
2세대는 주로 멤버 변수들이 머뭅니다. 물론 한번 사용하고 소멸되는 지역 변수에 담기는 객체에 있던 멤버 변수를 가리키는 것이 아닙니다. 그들을 사용하는 객체는 보통 3세대에 머물다 없어지는 객체들보다 오래 살아남기 때문에 2세대로 가는 경우가 많습니다. 그리고 이 객체들은 보통 멤버 변수에 담겨 있습니다.
1세대는 주로 static 변수들이 머뭅니다. static 변수는 보통 프로그램의 시작부터 종료까지 메모리에 남아있기 때문에 점차 세대를 옮겨가면서 1세대에 남아있는 경우가 많습니다.

하지만 프로그램을 잘못 작성하면 위의 확률적 통계를 벗어나는 경우가 많습니다. 예를 들어 한번 사용하고 버리는 객체인데 교차 참조를 하도록 만드는 경우 각자 어딘가에서 참조는 하고 있기 때문에 함수가 종료되어도 사라지지 않습니다. 예를 들자면 매우 많기 때문에 여러분이 코드를 작성하면서 이런 저런 고민을 해보면서 코드를 작성해보시기 바랍니다.

참고로 Windows Phone 7이나 Xbox360 등의 .NET Compact Framework 사용 플랫폼에서는 이런 문제가 덜하기 때문에 신경을 덜 쓰셔도 될 거라고 생각하는 분들이 많은데, 오히려 메모리 사용을 최소화하는 작업에 신경을 쓰셔야 하기 때문에 결국은 동일한 생각을 하셔야 할 것입니다.

0 Comments
댓글쓰기 폼