C# 메모리구조, 스택(Stack), 힙(Heap)

title-gonggo.png

C# 메모리구조, 스택(Stack), 힙(Heap)

오늘은 C# 메모리구조에 대해서 이야기를 하도록 하겠습니다. 이번에 다룰 내용은 포괄적인 이야기로 스택이 뭐고 힙이 뭔지에 대해서 자세하게 다루지는 않고, C#으로 코드를 짤때 어떻게 하면 메모리구조를 바르게 이해하고 효율적으로 메모리를 활용할지에 대한 이야기입니다.

 

img.png

 

우선 메모리 공간은 크게 2가지로 나눠지는데요. 스택영역과 힙영역입니다. 스택영역은 관리되지 않는 공간이고, 힙영역은 관리가 되는 영역입니다. 여기서 관리가 된다는 것은 사용하지 않는 메모리를 스스로 해제하여 사용하지 않은 공간을 정리해서 다른 메모리가 올라갈 수 있게 하는 것입니다. 

이때 메모리를 정리하는 일을 하는 것이 가비지 컬렉터입니다. 하지만 가비지 컬렉터가 자주 호출되면 메모리 공간을 정리하기 위한 리소스를 많이 사용하기 때문에 성능이 많이 떨어지게 됩니다. 그래서 코딩을 할때 메모리 공간을 잘 활용하면서 코딩하는 습관이 중요합니다. 


스택(Stack) 영역

스택 영역은 값 형식(Value Type)이 들어가는 메모리 공간입니다. 일반적으로 Value Type에는 int, string, double 과 같은 것들이 있습니다. 프로그래머가 선언한 Value Type 외에도 참조 형식의 메모리 구조도 스택영역에 들어가게 됩니다. 스택 영역은 함수에서 선언된 값 형식들은 함수를 빠져나가면 자동으로 메모리가 해제가 되기 때문에 따로 관리를 할 필요가 없습니다.

 

img.png

 

스택은 순서대로 값이 쌓이게 되고 함수를 들어갈때 쌓이고 함수를 나올때 쌓여있는 것을 해제하는 방식으로 작동하게 됩니다. 

또 struct 도 값 형식입니다. 함수에서 class를 new 하게 되면 함수를 빠져나와도 따로 해제를 하지 않으면 class 의 메모리가 남아 있습니다. 이렇게 남아있는 메모리가 많이 쌓이게 되면 가비지 컬렉터가 호출이 되기 때문에 가능하면 잠깐 사용하는 객체의 경우 class가 아닌 struct로 대체할 수 있으면 좋다고 봅니다.


힙(Heap) 영역

힙 영역은 참조 형식(Ref Type)이 추가되는 메모리 공간입니다. 힙 영역은 아래 그림처럼 도식화 할 수 있습니다.

 

img.jpg

 

힙 영역에 할당된 데이터는 계층 구조를 갖게 되는데요. 이때 중간 중간 메모리가 해제되면 계층 구조가 사라지거나, 노드 사이에 관계가 사라지게 됩니다. 그렇게 되면 빈 공간들이 생기게 되는데요. 이런 공간들은 사용하지 못하는 공간이 됩니다. 그래서 빈공간을 없애주고 메모리들을 정리하는 기능을 해줘야합니다. 이런 기능을 가비지 컬렉터가 해주는 것이죠. 

힙이나 스택에 대한 자세한 이야기는 자료구조로 넘어가기 때문에 다루지는 않았는데요. 코딩을 하면서 습관을 조금만 잘 만들면 메모리 공간을 최대한 활용하면서 메모리 관리가 잘 되는 프로그램을 만들 수 있습니다. 다음에는 어떻게 하면 메모리 관리를 잘 할 수 있는지 이미 많이 알려진 방법들에 대해서 이야기를 해보도록 하겠습니다.

0 Comments

최근글


새댓글


Facebook Twitter GooglePlus KakaoStory KakaoTalk NaverBand