C#에 CLR(Common Language Runtime) 에서는 객체의 크기에 따라 메모리를 크게 두가지로 나눠서 관리한다. 


- 용량이 작은 객체는 (85KB 미만) SOH(Small Object Heap) 


- 용량이 큰 객체는 (85KB 이상) LOH(Large Object Heap)


가비지 컬랙터가 두 힙(Heap)에 대해서 서로 다른 방식으로 관리는 한다.


SOH의 경우는 3가지 세대로 나눠서 가비지 컬랙션을 진행한다.


자세한 내용은 아래 링크를 참고하자.


- 세대별 가비지 컬렉션 방식 : http://hijuworld.tistory.com/41


LOH의 경우는 C와 C++의 메모리 관리 방식과 비슷하게 관리한다.


- C, C++에서 메모리 할당과 해제 원리 : http://hijuworld.tistory.com/28



아래 그림을 참고하자.



이전에 C와 c++에서 메모리 할당방식을 설명하기 위해서 사용했던 이미지 이다.


다른것은 가장 작은 객체의 사이즈가 85KB 이상이란 것이고 메모리 해제를 가비지 컬렉터가 알아서 한다는 것이다.




SOH와 LOH 가장 큰 차이점은 다음과 같다.


1. SOH는 가비지 컬렉션이 발생하면 해제된 메모리 공간들에 사용중인 메모리들로 재배치하지만 LOH는 메모리해제를 해도 해제된 공간은 그대로 둔다. 

 이는 메모리 사이즈가 큰 LOH들의 경우 메모리의 위치를 재배치하는 것은 오버해드가 크기 때문이다. 그때문에 메모리 단편화가 일어날 수 있다.


2. SOH는 0세대, 1세대, 2세대로 3가지 세대로 나눠서 메모리 관리를 하지만 LOH는 2세대밖에 존재하지 않는다. 

 그래서 2세대 가비지 컬렉션이 일어날 때에만 사용하지 않는 메모리를 해제시킨다. 하지만 이때 많은 오버헤드가 발생하게 된다.


LOH때문이라도 2세대 가비지컬렉션이 되도록 일어나지 않도록 주의해서 객체를 생성해야 한다.


그리고 메모리 단편화 때문에 용량이큰 객체는 너무자주 생성하고 해제하고를 반복하면 안된다.


최악의 경우 메모리 할당에 실패하는 경우가 발생한다.


그래서 큰 메모리를 자주 할당하는 것은 주의가 꼭 필요하다.

Posted by 꿈만은공돌
,