[C#] 메모리 영역

Minsang Kim·2024년 2월 9일
0

기술면접

목록 보기
6/6

오늘의 질문

C#의 메모리 구조는 무엇이며 어떤 차이가 있는지 비교해서 설명해주세요.

오늘의 답변

C#의 메모리 구조 영역으로는 코드, 데이터, 힙, 스택 영역이 있습니다.
코드 영역은 프로그램의 실행 코드가 저장되는 공간입니다.
데이터 영역은 정적 변수와 상수, 문자열들이 저장되는 공간입니다. 정적 변수는 프로그램이 시작될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지됩니다.
힙 영역은 사용자 관리 영역으로 사용자 정의에 의해 할당된 메모리에 저장하거나 해제하는 동적 할당을 사용합니다. 참조 형식의 데이터가 이 곳에 저장되며 가비지 콜렉터가 주기적으로 관리합니다.
스택 영역은 지역 변수, 매개 변수들이 저장되며 컴파일 시점에 크기를 할당하는 정적 할당을 사용합니다. 값 형식에 데이터가 이 곳에 저장되며 코드 블록이 끝나면 자동으로 메모리에서 해제됩니다.

깊게 보기

코드 영역

  • C# 프로그램은 MSIL (Microsoft Intermediate Language) 또는 CIL (Common Intermediate Language) 이라고 하는 중간 언어로 컴파일 되며, 이 MSIL 코드가 코드 영역에 저장된다.

  • 실행시 CLR (Common Lanaguage Runtime) 에 의해 MSIL 코드가 실제 기계 코드로 변환되고 실행된다.

데이터 영역

힙 영역

  • 참조 형식의 변수는 힙 영역에 데이터 값을 저장하고, 스택 영역에 데이터의 주소를 저장한다.
  • 코드 블록과 상관없이 데이터가 사라지지 않는다.

스택 영역

  • 값 형식 => int, char, bool + struct (※ string은 참조 타입)

stack overflow란 무엇인가?

  • 할당된 스택 내에 stack frame이 쌓이게 되는데, 과도한 재귀 또는 너무 큰 지역 변수를 선언하게 되면 stack 영역의 크기를 초과하게 되면서 다른 메모리 영역을 침범하는 현상

  • stack frame : 함수의 매개 변수, 반환 주소 값, 함수 내부의 지역 변수 등 함수의 호출 정보

그렇다면 heap overflow도 있는가?

  • 사용자가 힙 메모리를 관리해야 하는데 할당된 메모리 크기를 초과하게 되면 역시 똑같이 다른 메모리 영역을 침범한다. C#의 경우 GC가 알아서 관리해주지만 의도하지 않게 계속 참조하고 있거나 너무 큰 값을 할당하면 발생할 수 있다.

=====================================================

참조

[기술 면접 공부] C#의 메모리 구조
c# 메모리 구조, 메모리 영역(스택, 힙, 데이터, 코드)

profile
게임만 하다가 개발자로

0개의 댓글