본문 바로가기

.NET/CLR

(12)
닷넷에서의 메모리 할당 프로세스 오늘은 메모리 할당 프로세스에 대해서 얘기해 보고자 합니다. 아래의 flow chat를 봐주세요 위에 플로우차트를 보면 쉽게 아리라 생각됩니다. 먼저 메모리 할당 요청이 왔을경우. CLR heap Manager라는 놈이 위와 같이 처리를 하게 되는데 먼저 할당된 0 Gen Heap (budget을봄)용량을 봐서 너무 용량이 적다 하면 GC를 불러 청소를 시킵니다. 그렇지 않을 경우는 메모리 할당을 하게 되는데 NT Heap memory와는 달리 sement 안에 맨마지막 object 다음에 할당이 되게 됩니다. 그리고 finalize 메서드가 있는 object를 체크하기 되는데 이건 GC에 의해서 따로 관리가 됩니다.
Assembly Loader Assembly Loader란 CLR에서 .NET Assembly를 로드하기 위한 메카니즘을 말한다. 그럼 Assembly Loader는 어떻게 Assembly를 찾아 로드할까 ... 먼저 로드 프로세스부터 함 보자. 위의 프레세스를 보면 Assembly Binding 요청이 일어날 경우 어떤 Load Context를 불러 들일까 결정하게 된다. 그리고 그 Load Context가 결정 되면 그 안에 정보로 Assembly를 로드하게 된다. 그럼 로드 컨텍스트의 종류는 뭐가 있을 까. 3가지로 말할수 있는다 다음과 같다. 1. Default Load Context -이 컨텐스트로 로드가 결정된 넘들은 Assembly.Load로 로드된다. 모든 GAC영역의 Assembly 그리고 대부분의 Assembly들..
PE file and Application domains 우리가 일반저으로 실행하는 exe, sys, dll등의 파일들이 PEfile 파일들이라고 보면된다. 윈도우즈 로더는 PE파일을 보고 헤더에 있는 entry point 필드를 보고 그 주소를 읽어 해당 주소로 점프해 그 함수를 호출하게 된다. 닷넷의 모든 컴파일드된 파일은 이러한 entry point주소가 있고 reference해야하는 dll의 주소도 가지고 있다. 나는 닷넷의 경우만 예를 들겠다. 윈도우즈 로더는 entry point의 주소를 찾아 호출하게 되는데 과연 이 entry points는 어떤 dll의 어떤 함수일까? 자도 잘모르지만 한번 적어본다. 정확한 dll의 이름은 생각나지 않지만 mscoree.dll인가? 이런 비스무르한 dll의 entry point 를 호출하게 된다 .실제적인 메서드..
GC(Garbage Collection) 내용이 여러분이 알고 있는 내용과 상이한 부분이 있습니다.(제가 틀려도 넘 나무라지 마세요) GC는 닷넷에서 야심차게 들고나온(Java도 있지만)일종의 Memory 관리자라고 할수 있을것같습니다. 닷넷의 메모리는 managed Heap에 데이터가 축적되는데 어느정도 메모리가 차면 GC가 깨어나서 쓰레기들을 청소한다고 보면 됩니다. GC는 세대라는걸로 Heap 메모리를 구분하는데 0세대 1세대 2세대 이렇게 3개의 세대로 구분합니다. 이 힙메모리는 sement라고곳에 생기는데 처음 메모리가 생성될때 2개의 세그먼트를 만듭니다.(각 segment는 16메가입니다.) 하나는 작은 객체의 메모리를 위해(small of heap) 다른 하나는 큰 객체의 메모리를위해(Large of Heap) 어떤쓰레딩이 실행 될..