본문 바로가기

.NET/CLR

GC(Garbage Collection)

내용이 여러분이 알고 있는 내용과 상이한 부분이 있습니다.(제가 틀려도 넘 나무라지 마세요)

GC는 닷넷에서 야심차게 들고나온(Java도 있지만)일종의 Memory 관리자라고 할수 있을것같습니다.

닷넷의 메모리는 managed Heap에 데이터가 축적되는데 어느정도 메모리가 차면 GC가 깨어나서 

쓰레기들을 청소한다고 보면 됩니다. 

GC는 세대라는걸로 Heap 메모리를 구분하는데 0세대 1세대 2세대 이렇게 3개의 세대로 구분합니다.

이 힙메모리는 sement라고곳에 생기는데 처음 메모리가 생성될때 2개의 세그먼트를 만듭니다.(각 segment는 16메가입니다.)

하나는 작은 객체의 메모리를 위해(small of heap) 다른 하나는 큰 객체의 메모리를위해(Large of Heap)

어떤쓰레딩이 실행 될때 0세대의 Heap Memory가 어느적정 수준에 차면(다이나믹하게 변함) GC를 깨웁니다.

정확히 얼마나 찰때 GC가 발생하는지 모르지만

어느정도 찼을때 GC가 일어나게 됩니다. GC가 일어나면 0세대 Application Root의 (local variable,CPU

레지스터 변수가 가지고 있는 참조, static field, 전역 변수) Object Graph를 그려 참조되지 않는 object를 쓰레기라고

여겨 메모리에서 해제시키고 다시 0세대에 있는 객체를 1세대로 올리고 1세대는 2세대로 승격(promotion)을 시켜줍니다. 이때 메

모리 정리가 일어나는데 이런걸 compact된다라고 합니다.(승격이 일어날때 1세대에서는 충분한 메모리 공간이 있는지 체크합니다 만약 충분한 메모리 공간이 확보되지 않으면 가비지 콜렉션이 1세대에서 발생하게 됩니다. 이러한 것은 2세대도 마찬가지 입니다.)

이와는 달리 LOH(Large objet heap)이라는 것이 있는데 이놈은 위와는 달리 세그먼트의  Heap메모리에서 관리됩니다.

사이즈 기준은 83KB정도인데 83
KB보다 크면 위의 0,1,2세대와는 다른 영역에 저장되게 됩니다.

메모리 관리는 위와는 달리 unmanaged memory관리처럼 비슷한 방식으로 됩니다. 컴팩팅이 안일어나고 free list를 통해 자원이 릴리즈 됩니다.


GC가 이게 다냐 이렇게 물으신다면 No라고 말할수 있습니다.

GC의 종류에는 Workstation GC와 Server GC크게 두가지로 나눠져있습니다.

또 Workstation GC는 NonConcurrent와 Concurrent로 나눌수있습니다. 세부사항은 msdn에서 참고하시기 바랍니다.

아참 4.0에서는 background GC가 Concurrent GC를 대채합니다.  세부적으로 파고들면 저도 몰라요..

Server GC는 일반적으로 ASP.NET이나 MS SQL에 디폴트로 사용되고 있습니다.  이때 사용주의점 

Server GC는 특성상 multi core에 논리적 프로세스 수만큼 생기므로 시스템상에서 메모리가 부족할때 GC가 무수히
많이 생성되어 한꺼번에 동시에 잠에서 깨어 날수 있습니다. Server GC의 모든 GC스레드가 완료될때 비로서 다른 어플리케이션 스레드는 재가동 됨으로 어플리케이션에 상당한 영향을 끼칠수 있습니다. 이점을 조심하십시오

그럼 이쯤마무리???
 

 위에서 가장중요한 핵심은 GC가 일어날 시기는 아무도 모른다는 것입니다. 0세대의 힙의 버짓(budget:GC가일어날시점)도 모르고 (유동적으로 변하기 때문) 그러나 0세대 1세대의 콜렉션은 그렇게 부하가 안걸립니다. 0.001초정도 걸릴까요 ㅋㅋ 문제는 2세대 또는 LOH입니다. 53kb이상의 템프성 데이터를 마구 생성하면 아마 미처버리겠죠?

ㅋㅋ