이전에 C#에서 가비지 컬렉션이 어떤 방식으로 메모리를 할당하고 해제 하는지에 대해서 포스팅 하였다.
해당 포스팅은 아래 링크를 참고하자.
C, C++에서 메모리 할당과 해제 원리 : http://hijuworld.tistory.com/28
C#/닷넷 에서 가비지 컬렉션의 메모리 할당 및 해제 기본 원리 : http://hijuworld.tistory.com/32
이번에는 가비지 컬렉션이 동작할때 세대별로 관리를 하는 방식에 대해서 알아보자.
힙영역에 할당된 메모리들은 0세대, 1세대, 2세대 세가지로 구분된다.
가장 처음 할당되는 메모리들은 0세대이며 가비지 컬렉션이 한번이 이루어 질때마다 한세대씩 증가한다.
가비지 컬렉션은 0세대 가비지 컬렉션 부터 발생하며 0세대 가비지 컬렉션은 0세대 메모리들만을 메모리해제 한다. 남은 메모리들은 1세대씩 증가한다.
0세대 가비지 컬렉션이 이루어 졌는데도 메모리가 부족하다 판단되면 1세대 가비지 컬렉션이 발생한다.
그러면 0세대 메모리와 1세대 메모리 모두 사용하지 않는 메모리는 해제된다. 그리고 한세대씩 증가하게 된다.
0세대와 1세대 가비지 컬렉션이 발생하였는데도 메모리가 부족하면 2세대 가비지 컬렉션이 발생한다.
글로 이해하면 어려울 수 있으니 아래 그림을 참고하자.
0세대 가비지 컬렉션의 원리이다.
아래는 1세대와 2세대 가비지 컬렉션 동작 원리이다.
이러한 방식으로 동작하는 이유는 최근 생성된 객체는 금방 사용하지 않을 가능성이 높고 오래된 객체일수록 계속 사용할 가능성이 높은 이유이다.
2세대 가비지 컬렉션은 상당히 큰 오버해드가 될 수 있다.
가비지 컬렉션이 똑똑하기는 하지만 완벽하지는 않다. 항상 주의해서 사용해야 한다.
Google에 C# 메모리라고 검색해도 C#에 메모리에 관한 이슈가 많이 검색이 된다.
한번 프로그램을 다 만들고 나서 이후에 관련 메모리 이슈를 해결하려면 쉽지 않기 때문에 프로그램을 만들면서 서 주의를 해야 한다. 특히나 24시간 돌아가는 프로그램들에 특히 주의가 필요하다.
다음으로 메모리 사이즈가 큰 객체에 대해서는 어떻게 가비지컬렉션이 일어나는지 알아보자.
용량이 큰 객체에 메모리 할당 해제 방식 : http://hijuworld.tistory.com/46
'닷넷,C#,.NET' 카테고리의 다른 글
C#/.NET 구조체(struct)와 클래스(class) 차이 (6) | 2018.05.13 |
---|---|
C#/.NET 이벤트(Event) 이해하기 (3) | 2018.05.11 |
C#/.NET 델리게이트(delegate) 체인(chain) (0) | 2018.05.09 |
C#/.NET 델리게이트(delegate)와 함수 포인터, 델리게이트 체인 (0) | 2018.05.09 |
C#/.NET 연산자 오버로딩(operator) (0) | 2018.05.08 |