.Net 에서 Method를 로드 하는 방법

출처: 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 로 저장됩니다.


image
os 독립적이인 IL 코드 예시


image

이렇게 메소드를 호출하라고 하면
JIT Compiler 가 Compiler 를 하고 네이티브 언어로 변환해
Code Heap 에 저장합니다.

제가 이해하기로는 Code를 메모리에 IL CODE로 저장을하고
실행을 할때 Code Heap 에 기계어로 저장한다고 이해했습니다.

그리고 Code Heap 바이너리를 실행합니다.

image

이때 Code Heap 은 Loader Heap 주소를 Cache 하고 있어 재호출 시에는
컴파일 과정을 생략할수 있습니다.

그래서 좀더 빠른 실행을 보장할수 있고 엄밀히 말해서 컴파일 과정은
Code Heap 에 네이티브언어로 들어갈때를 컴파일 과정이라고 할수 있습니다.

그리고 제가 이해하기로는 Loader Heap 은 GC 대상이 아니라서
프로그램이 실행중에는 항상 메모리에 상주한다고 합니다.

너무 깊은 질문을 하시면 누군가 도와주실것라 생각합니다. ^^

12 Likes

제가 알고 있기로도 GC란, GC heap에 대해서만 동작하는 것이기 때문에 다른 heap에는 영향을 미치지 못하는 것으로 알고 있습니다.

2 Likes

특정 메서드의 수행 시간을 테스트할 때, 컴파일 과정에서 발생하는 로드를 제거하기 위해 성능 측정 전에 메서드를 한 번 호출하곤 했습니다.

그동안 막연히 컴파일 과정이 있다고만 생각했는데, 이번에 상세한 내용을 알게 되어 감사합니다. :slight_smile:

1 Like