본문 바로가기

.NET/CLR

Pinned된 object와 조각화(CLR)

메모리에서 pinned object라는 얘기를 누구나? 한번쯤은 들어봤을 거다..

이게 과연 뭘까?

말그대로 꽂혀있는 object다 무슨말인고 하니 GC가 구동됐을때

pinned object는  application root에서 참조되고 있을때 다음세대로 프로모션하게 되는데

이놈들은 그렇지 않다  그리고 collection이 일어나면 메모리 compaction(재정리및할당)이 일어나게 되는데

이때도 이놈들은 예외가 된다. 왜 이런 기능이 필요할까 ?

간단하게 예를 들어보겠다. 어떤 managed code에서 p/invoke나 com같은

native한 메서드에 인자값으로 managed pointer를 넘겨줬다고 하자 그후 GC가 일어나면

인자값으로 넘긴 놈도 compcation이 일어나 메모리 주소가 바뀌게 된다. 고로 위와 같은 케이스는 뻑날거다.

나도 실제적으로는 안해봤다. ㅋㅋ 허나 누가봐도 명백한 뻑이다.

그럼 어떻게 해결해야 하느냐? 위에서 말한 object를 고정시켜주면 된다.

그래서 이러한 object 들은 clr의 handle테이블에 들어가게 되는데 GC가 일어나 이 핸들테이블의 있는 object들은

promotion(승격)과 compaction(메모리 재정리)을 안한다.

내가 맞거나 말거나 나는 그냥 내 지식을 쓸뿐이고. ㅋㅋㅋ 믿거나 말거나 그건 여러분 몫이고