Heap 메모리와 GC 알고리즘

해진·2024년 5월 13일

조각 테크 공유

목록 보기
7/16
post-thumbnail

들어가며)

Heap. 자료구조, 알고리즘 적으로는 꽤나 익숙하실 것입니다. 그러나 이번 주제로는 힙 메모리라는 영역과 그를 관리하는 가비지 컬릭터에 대해서 이야기해 보려 합니다.

Heap 메모리란

힙 메모리란 자바스크립트에서 참조 타입(객체 등) 데이터를 저장하기 위한, 메모리 할당을 하는 영역으로 js에서 동적으로 할당되는 데이터를 저장하는 공간입니다.

힙 메모리의 경우 변수가 생성되고 해제될 때까지 데이터를 유지하며, 할당 및 해제는 프로그램 실행 중 자동으로 이루어집니다. 힙은 스택과 달리 구조화되지 않은 자유 형식의 메모리 공간으로 필요에 따라 동적 확장 및 축소 가능합니다.

힙의 동적 메모리 할당

  • 객체 및 함수
  • 런타임에 크기를 알 수 있음
  • 객체당 제한 없음

JS에서 힙 메모리의 중요성

js 엔진은 가비지 컬렉션을 통해 힙 메모리를 자동 관리합니다.

힙 메모리는 참조 타입 데이터(예: 객체, 함수)를 저장하는 데 사용되며, 프로그램의 동적 데이터가 저장되는 주요 공간입니다. 이 메모리 영역은 데이터가 필요한 동안 유지되며, 더 이상 필요하지 않을 때 자동으로 해제됩니다.

힙 메모리 관리의 효율성은 프로그램의 성능과 직결됩니다. 효율적인 메모리 관리는 메모리 누수를 방지하고, 애플리케이션의 반응성과 안정성을 유지하는 데 중요합니다. 메모리 누수는 미사용 메모리가 적절히 해제되지 않아 계속해서 메모리 사용량이 증가하는 현상을 말하며, 이는 결국 성능 저하나 애플리케이션의 실패를 초래할 수 있습니다.

GC: Garbage Collector

가비지 컬렉션은 메모리에서 더 이상 사용하지 않는 객체를 자동으로 검출하고 더 이상 쓰지 않는 버리는 값으로 판단하여 그 메모리 공간을 해제합니다.

이런 과정은 프로그램의 메모리 효율성을 보장하게 되며, 메모리 누수를 방지합니다.

그러면 어떻게 더 이상 사용하지 않는 메모리라고 판단하는 것일까요? 그리고 GC가 동작하는 동안 프로그램이 중단되는 시간을 줄일 수 있을까요? 이는 일부 알고리즘을 사용해 해결합니다.

  • Reference-counting garbage collection 이는 가리키는 참조가 없는 객체를 수집합니다. 객체가 생성될 때마다 해당 객체를 참조하는 변수, 속성, 또는 다른 객체들에 대한 참조 수가 증가하고, 참조가 해제될 때마다 감소합니다. 참조 수가 0이 되면, 즉 어떤 다른 객체나 변수도 해당 객체를 참조하고 있지 않을 때 해당 객체는 가비지로 간주되어 메모리에서 해제됩니다. 그러나 이 알고리즘의 경우 객체들 사이의 순환 참조가 발생하는 경우, 참조 수가 0이 되지 않는 경우가 있어 메모리 누수가 발생할 수 있습니다.
  • Mark-and-Sweep 'mark' 단계에서는 GC의 Root에서부터 모든 변수들을 스캔하며 각각 어떤 객체를 참조하고 있는지 찾아 마킹힙니다. 이는 참조되고 있는 객체와 참조되지 않은 객체들을 식별하는 과정입니다. ‘sweep’단계에서는 참조되지 않는 객체들을 Heap에서 제거합니다. +Compact: 이는 알고리즘에 따라 추가될수도 있는 부분으로, Sweep 후, 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 나눕니다. (메모리 단편화 방지) 위 방법은 순환 참조로 인한 문제를 해결할 수 있으며, 지금의 js 엔진에서 많이 사용됩니다.

참고 글:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management#garbage_collection

https://velog.io/@sejinkim/자바스크립트의-메모리-관리-설명

https://imasoftwareengineer.tistory.com/103

profile
안녕하세요, Frontend 개발자 윤해진입니다.

0개의 댓글