.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개의 좋아요

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

2개의 좋아요

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

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

1개의 좋아요