이 글의 내용은 Deepu K Sasidharan님이 쓰신 Demystifying memory management in modern programming languages 글을 요약 정리한 내용이다.
소프트웨어를 실행할 때 소프트웨어는 실행해야 하는 자신의 bytecode를 로드하고, 프로그램에서 사용하는 데이터 값과 데이터 구조를 저장한다. 또한 프로그램을 실행하는 데 필요한 모든 런타임 시스템을 로드한다.
소프트웨어 프로그램이 사용하는 메모리 영역에는 두가지가 있다. bytecode를 로드하기 위해 사용하는 공간을 제외하고, 스택 및 힙 메모리라는 두가지 영역을 사용한다.
정적 메모리 할당에 사용되며 후입선출이다.
동적 메모리 할당에 사용되며 스택과 달리 “포인터”를 사용하여 데이터를 조회해야 한다.
RAM은 무한하지 않기 때문에 프로그램이 메모리를 해제하지 않고 계속해서 메모리를 소모한다면 메모리가 부족해지고 운영체제와 충돌할 수도 있다.
C와 C++ 처럼 수동적으로 메모리를 관리하는 언어가 있으며, 자동으로 사용하지 않는 메모리 할당을 해제하는 자바스크립트, JVM(Java, Scala, Groovy, Kotlin), Ruby, Golang 등의 언어도 있다.
자바스크립트를 포함하여 자동으로 메모리를 관리하는 언어들은 활성인 개체를 먼저 표시하고 그 다음 활성이 아닌 개체의 메모리를 해제하는, 일반적으로 2단계 알고리즘인 Mark & Sweep GC(Tracing GC라고도 한다.)를 이용하여 메모리를 관리한다.
V8 엔진 내부의 메모리 관리 시각화 하기 - TOAST UI
당신이 모르는 자바스크립트의 메모리 누수의 비밀 - TOAST UI