스택과 힙 그리고 메모리 관리

제이제이·2022년 8월 24일
0
post-thumbnail

이 글의 내용은 Deepu K Sasidharan님이 쓰신 Demystifying memory management in modern programming languages 글을 요약 정리한 내용이다.

메모리 관리

소프트웨어를 실행할 때 소프트웨어는 실행해야 하는 자신의 bytecode를 로드하고, 프로그램에서 사용하는 데이터 값과 데이터 구조를 저장한다. 또한 프로그램을 실행하는 데 필요한 모든 런타임 시스템을 로드한다.

소프트웨어 프로그램이 사용하는 메모리 영역에는 두가지가 있다. bytecode를 로드하기 위해 사용하는 공간을 제외하고, 스택 및 힙 메모리라는 두가지 영역을 사용한다.

스택(Stack)

정적 메모리 할당에 사용되며 후입선출이다.

  • 후입선출의 특성 상 스택에서 데이터를 저장하고 검색하는 것은 최상위 블록(가장 마지막 블록)에서 이루어지기 때문에 매우 빠르다.
  • 위와 같은 특징으로 인해 데이터가 유한하고 정적이어야 한다.
  • 함수가 새 변수를 선언할 때 마다 스택의 최상위 블록으로 푸시되고, 함수가 종료될 때 마다 해당 함수에 의해 스택에 푸시된 모든 변수가 지워진다.
  • 스택에 저장되는 일반적인 데이터는 지역변수, 포인터, 함수 프레임이다.
  • 다중 스레드 어플리케이션에서는 각 스레드마다 스택을 가질 수 있다.
  • 스택의 크기가 힙에 비해 제한되어 있기 때문에 stack overflow 오류가 발생하기도 한다.
  • 스택의 메모리 관리는 간단하고 직관적이다.

힙(Heap)

동적 메모리 할당에 사용되며 스택과 달리 “포인터”를 사용하여 데이터를 조회해야 한다.

  • 스택보다는 데이터를 조회하는 프로세스가 복잡해서 더 느리지만 더 많은 데이터를 저장할 수 있다.
  • 동적 크기의 데이터를 여기에 저장할 수 있다.
  • 동적 특성으로 인해 힙은 관리하기가 더 까다로우며 대부분의 메모리 관리 문제가 여기에서 발생한다.
  • 힙에 저장되는 일반적인 데이터는 전역 변수, 참조유형(문자열, 객체, maps 등)이다.
  • 애플리케이션이 할당된 힙보다 더 많은 메모리를 사용하려고 하면 메모리 부족 오류가 발생한다. 힙에 저장할 수 있는 크기에 제한은 없으나 애플리케이션에 할당되는 메모리의 상한선이 있다.
  • 힙 단편화: RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태

메모리 관리가 중요한 이유

RAM은 무한하지 않기 때문에 프로그램이 메모리를 해제하지 않고 계속해서 메모리를 소모한다면 메모리가 부족해지고 운영체제와 충돌할 수도 있다.

자바스크립트의 메모리 관리

C와 C++ 처럼 수동적으로 메모리를 관리하는 언어가 있으며, 자동으로 사용하지 않는 메모리 할당을 해제하는 자바스크립트, JVM(Java, Scala, Groovy, Kotlin), Ruby, Golang 등의 언어도 있다.

자바스크립트를 포함하여 자동으로 메모리를 관리하는 언어들은 활성인 개체를 먼저 표시하고 그 다음 활성이 아닌 개체의 메모리를 해제하는, 일반적으로 2단계 알고리즘인 Mark & Sweep GC(Tracing GC라고도 한다.)를 이용하여 메모리를 관리한다.

함께 보면 좋은 글

V8 엔진 내부의 메모리 관리 시각화 하기 - TOAST UI
당신이 모르는 자바스크립트의 메모리 누수의 비밀 - TOAST UI

profile
그날그날의 최선을 다하기💪 피드백은 언제나 환영입니다!

0개의 댓글