C# Large Object Heap

Featured image

C#의 CLR은 Heap을 관리할 때 크게 두 가지로 나눠서 관리를 한다.

SOH는 일반적으로 알고 있는 세대별 가비지 컬렉션을 이용하여 관리를 하는 반면에 LOH는 그렇지 않다. LOH의 경우는 메모리 관리 방식이 C, C++에서 사용하는 방식과 비슷하게 관리한다.

SOH에서는 GC가 일어나면 힙상에서 메모리를 재배치 시키는 컴팩션이 일어나지만, LOH는 컴팩션이 일어나지 않고 해제된 공간을 그대로 둔다.

위에서 얘기했다 싶이 SOH는 세대별 가비지 컬렉션을 이용하기 때문에 0~2세대가 존재하는 반면 LOH는 2세대 밖에 존재하지 않는다. 그래서 GC 2가 발생할 때만 수행이 된다. (SOH의 GC2가 일어날 때 LOH도 함께)

반대로 LOH에 대해 많은 메모리가 할당이 이루어져도 GC 2가 발생하기도 한다. GC 2가 이루어지면 많은 오버헤드가 발생하는데, GC 2가 발생한 후에 LOH에 추가적으로 많은 객체가 할당하게되면 얼마지나지 않아 GC 2가 다시 발생할 수 있다.

그렇기 떄문에 GC 2가 되도록 일어나지 않도록 큰 객체를 자주 할당하는 것은 주의가 필요하다.


Reference

가비지 컬렉션 다시 보기 Part III