C#의 Heap

[제목] C#의 Heap

C# 프로그램을 실행하면 4개의 Heap이 생성된다 - Process Heap, JIT Code Heap, Small Object Heap, Large Object Heap.

(주: 이글은 [C# 스터디 그룹]에 2014-10-22일 올린 글로서 개발자 노트에도 남깁니다)

이 중 우리에게 친숙한(?) 그리고 가장 중요한 Heap은 Small Object Heap과 Large Object Heap 인데, 이 둘을 합쳐 - GC가 관리하는 - Managed Heap이라 부른다.

OOP의 관점에서 C# 클래스는 크게 2종류로 구분할 수 있다 - 필드(데이타)와 메서드(코드).
클래스로부터 새로운 객체를 생성하면 클래스의 필드들은 Managed Heap에 메모리를 할당받아 필드값을 초기화한다.
static 필드는 프로그램 초기에 생성되고, instance 필드는 객체가 생성될 때 할당된다.

반면 메서드는 Managed Heap 메모리에 할당되지 않으며 어떠한 자리도 차지하지 않는다. 예를 들어, 클래스A가 int타입의 필드1개와 100개의 메서드로 이루어져 있고, 이 클래스A의 인스턴스를 1000개 만든다면, 메모리에는 int 4bytes x 1000 = 4000 bytes 가 할당된다 (객체 overhead 논외). (참조: C# 클래스 객체는 어떻게 Managed Heap에 표현되는가? )

그렇다면 메서드는 어디에 저장되는가?
static 메서드이든 instance 메서드이든 모든 메서드는 호출시에 On the fly로 JIT 컴파일된다. 이 JIT 컴파일의 결과(native code)는 프로그램의 '데이타가 저장되는 Managed Heap'과 전혀 다른 JIT Code Heap 영역에 저장된다. JIT 컴파일된 코드 영역은 (비록 메모리가 모자라 Paging을 할 수는 있으나) Code Heap에서 프로그램이 종료될 때까지(좀 더 정확히 AppDomain이 종료될 때까지) Clear되지 않는다. 이 영역은 GC가 관리하지 않는 영역이며, 관리할 수 없는 영역이다.


본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.