삽질의 현장/- .NET

#040_닷넷(.NET)_.Net Framework 기본 - 세대

shovelman 2015. 10. 29. 03:59


안녕하세요 삽잡이입니다.


이번 시간에는 Garbage Collection의 대상인 객체들을

쓸어모아주는 Garbage Collector가 효율적으로 동작시키도록 도와주는...

(말이 길지요...)

'세대'라는 개념에 대해서 알아보겠습니다.


현재 .Net Framework 4.0까지는

가비지 컬렉터 즉, GC 클래스에는 세가지 상태의 종결 객체

즉, '가비지 컬렉션 제거 대상' 객체가 존재합니다.



객체가 최초에 만들어지면 

그 최초에 만들어진 객체들은 '0 세대'입니다.

따끈따근하지요...


가비지 컬렉션이 한바퀴 쫘악 돌고 오면

루트가 없는 것들을 체크할 것입니다.


즉, 메모리가 부족하게 될 경우에 가비지 컬렉터는 동작하게됩니다.

이 때에 루트가 없는 놈들을 확인하고 제거하고 나머지들은 1세대가 됩니다.

0세대에 있넌 객체들 중 살아남은 객체들만이 1세대가 되는 것이지요...


한번 생각을 해봅시다...

방금 만들어진 객체가 제거될 가능성이 클까요?

아니면 이전에 만들어진 객체가 제거될 가능성이 클까요?

사실, 방금 만들어진 객체가 제거될 가능성이 더 큽니다.



stack에서 메모리가 쌓이는 구조를 생각해보시길 바랍니다.

어떤 메모리들이 먼저 없어집니까?


아무튼... 이에 세대를 만들어 놓은 것입니다.


가비지 컬렉터는 이 처럼 동작하게 됩니다.

0세대에서 가비지 컬렉션을 하고 난 뒤에 메모리가 남게되면

GC는 1세대를 검사하지 않고 멈춥니다.

그런데 만약, 0세대를 검사하고도 1세대에 객체들이 남았는데,

그 사이에 또 0세대에 새로운 객체들이 들어온다고 해봅시다.


그런데 또 이제 메모리가 부족하게 되면?

이제는 1세대를 검사하게 됩니다. 또 거기서 check 되어있는 대상들을 파악하고

해등 객체들을 제거시키는 것입니다.


반복해서 1세대에 살아남은 객체들은 2세대가 되지요...

대부분 2세대의 것들은 Main에서 만들어진 것들로 이루어져 있습니다.


아무튼... 2세대에 있는 객체들은 더 오래 살아남을 객체들일 확률이 크다 이겁니다.


이 '세대'라는 개념은 가비지 컬렉션의 효율성을 위해 만들어진 개념입니다.


이번 시간은 여기까지 하도록 하곘습니다!


이상 삽잡이였습니다!