본문 바로가기

.NET/CLR

Finalize Method는 왜 필요한가?

오늘 같은 개발자와 얘기를 했다. 아래의 포스트된 DataTable은 꼭 dispose해줘야 하는가에 대해서다.

거기 예제 코드를 보면 DIspose하는 부분이 나오는데 많은 개발자 분들이 오해를 하기를

Dispose를 시켜주면 메모리 해제를 바로 시켜준다고 착각하고 계신다.

앙... 그럼 안되는데 ^^;

모든 managed code들은 CLR에서 관장하게 된다. 메모리 할당에서 부터 해제까지 CLR안에서 격리되어 움직인다.

닷넷의 가장 좋은 점이 무엇인가 바로 메모리 관리를 GC가 알아서 해준다는 것이다. CLR Loader가 메모리를 할당해주고 그 메모리를 해제시켜주는 몫은 바로 CLR의 GC가 담당하게 된다.

그럼 의문이 생긴다. 시스템 자원을 썼을때 어떻게 해줘야하나? 이러한 메모리 해제를 위해서 CLR은 finalize 메서드를 제공한다. 가령 DB Connection이나 파일시트림이나 등등을 해제 시켜줄때 우리는 Finalize메서드를 쓴다.

그리하여 메모리 누수를 막기위해서 Dispose시켜주는것이다.

앞에서 Finalize메서드를 잘 써야하는 이유에 대해서 설명했는데 다시한번 설명하겠다. 그림은 없다..

좀더 알고 싶으면 http://www.simpleisbest.net/post/2011/05/12/Finalizer-Usage-Pattern.aspx 링크를 봐라

조금 내가 아는 내용과 상이한 부분이 있다. 위의 링크의 필자는 Finalize Queue랑 F-reachable Queue랑 같이 취급하는데 내가 아는 지식은 좀 다르다 어떻게 다른가? 지금부터 말해보겠다.

1. CLR Loader 가 Finalize 메서드를 가진 A객체를 managed heap에 할당 동시에 finalize queue에 삽입
2. GC0이 일어났을때 Rootless가 된 A객체를 1세대로 승격.
3. finalize queue에 있는 놈을 F-reachable queue로 이동
4. 언제인지 모르지만(GC1) finalize thread가 돌아서 f-reachable queue에 쌓인 객체를 하나씩 꺼내어 finalize메서드 호출. 객체릴리즈

끝 ^^ 맞나 모르겠네 아님말고 ㅋㅋㅋ