출처: https://youtu.be/j85Tc73WHbA?si=suytREAxs6UVwYPo
.Net 에서 메소드를 호출할떄 일어나는 일
예를들어 이런 코드가 있다고 했을떄
Class 본문을 선언하고
Animal animal =new();
animal.Speak();
일어나는 상황을 자세하게 알아봅시다.
.Net 에서 해당 코드를 실행하기 위해서는 두개의 힙이 작동합니다.
Loader Heap
Loader Heap은 .NET CLR이 타입, 어셈블리 메타데이터, 메서드 테이블 등의 정보를 저장하기 위해 사용하는 힙입니다.
- 어셈블리, 타입 정보, 메서드 테이블 등 CLR이 관리해야 하는 메타데이터를 저장.
- 이러한 정보는 애플리케이션 실행 중 공유되고, 자주 액세스되므로 빠른 참조가 필요합니다.
- Loader Heap은 어셈블리 로딩 시 CLR에 의해 한 번만 할당됩니다.
- 주로 읽기 전용 데이터를 포함하므로 메모리 낭비가 적고, GC(가비지 컬렉션)의 대상이 아닙니다.
Code Heap
Code Heap은 JIT 컴파일러가 IL(Intermediate Language) 코드를 네이티브 코드로 변환한 후 저장하는 영역입니다.
- IL 코드를 네이티브 코드로 컴파일한 결과를 저장하여 이후 호출 시 성능 향상을 도모.
- 이 네이티브 코드는 실행 가능한 상태로 저장되며, 프로세서가 직접 실행할 수 있습니다.
프로그램이 실행되면
Loader Heap Animal Class 메타 데이타가 IL Code Address 로 저장됩니다.
os 독립적이인 IL 코드 예시
이렇게 메소드를 호출하라고 하면
JIT Compiler 가 Compiler 를 하고 네이티브 언어로 변환해
Code Heap 에 저장합니다.
제가 이해하기로는 Code를 메모리에 IL CODE로 저장을하고
실행을 할때 Code Heap 에 기계어로 저장한다고 이해했습니다.
그리고 Code Heap 바이너리를 실행합니다.
이때 Code Heap 은 Loader Heap 주소를 Cache 하고 있어 재호출 시에는
컴파일 과정을 생략할수 있습니다.
그래서 좀더 빠른 실행을 보장할수 있고 엄밀히 말해서 컴파일 과정은
Code Heap 에 네이티브언어로 들어갈때를 컴파일 과정이라고 할수 있습니다.
그리고 제가 이해하기로는 Loader Heap 은 GC 대상이 아니라서
프로그램이 실행중에는 항상 메모리에 상주한다고 합니다.
너무 깊은 질문을 하시면 누군가 도와주실것라 생각합니다. ^^