가비지 컬렉션 (Garbage Collection)

citron03·2022년 2월 21일
0
  • 프로그램에서 더 이상 사용되지 않는 메모리를 찾아 해제한다.
    🍈 C언어에서는 더 이상 사용하지 않는 메모리 할당을 프로그래머가 스스로 할당 해제하지만, 자바나 자바스크립트, C#같은 언어에서는 가비지 컬렉션을 제공하여 가비지 컬렉션이 자동으로 사용되지 않는 메모리를 정리한다.
  • 가비지 컬렉션에서 중요한 것은 참조(reference)이다.
    참조의 갯수를 세거나, 더 이상 참조를 통해서 접근할 수 없다면, 그 메모리를 할당 해제한다.

가비지 컬렉션의 주요한 알고리즘에는 트레이싱 방법(mark and sweep)과 레퍼런스 카운팅 방법(Reference-counting)이 있다.

Reference-counting

  • 한 객체를 참조하는 레퍼런스의 수를 추적하여 센다.
  • 처음에는 특정 할당된 메모리 부분에 대해서 레퍼런스의 숫자가 하나지만, 변수가 복사될수록 레퍼런스의 카운트는 늘어난다.
  • 변수의 값이 바뀌거나 변수 스코프를 벗어나면, 레퍼런스 카운트의 값은 줄어든다.
  • 레퍼런스 카운트가 0이 되면, 해당 메모리 값을 참조하는 객체는 없는 것이므로 할당 해제한다.
    🍋 어떤 객체도 해당 메모리 값에 대해서 레퍼런스를 가지지 않는 상태
  • 하지만, 만약 두 객체가 서로를 참조한다고 하면 실제 이 두 객체가 사용되지 않아도 레퍼런스 카운트는 1에서 더 이상 내려가지 않는다.
  • 때문에, 메모리의 누수가 발생할 수 있다.
    🍒 이를 순환 참조(circular references)라고 한다.

mark and sweep

  • 객체에 flag를 두고, 싸이클마다 메모리 관리자가 모든 객체를 추적하여 사용중인지 판별한다.
  • 그리고 표시되지 않은 객체를 sweep, 즉 해당 객체의 메모리를 할당 해제한다.
  • roots라는 객체의 집합에서 시작하여 roots가 참조하는 객체의 집합으로 내려가고 그 객체들이 참조하는 집합을 따라 내려간다.
  • 이렇게 roots부터 시작하여 끝까지 내려간 뒤에도 아직 mark되어 있지 않은 객체가 있다면, 해당 객체는 도달할 수 없는 객체로 판단하고 할당 해제한다.
  • mark and sweep 방법을 사용하면 순환 참조에 의한 메모리 누수가 없기에, V8 엔진에서도 채택된 방법이다.
    🥥 최신 브라우저에서는 mark and sweep 방법으로 가비지 컬렉션을 한다.

다만, 프로그래머가 명시적으로 메모리를 할당해야 하는 경우도 있을 수 있다.

자바스크립트는 C언어의 free와 같은 명시적인 가비지 컬렉션 방법이 없다.

참고 자료 : 코드 스테이츠,
https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management

profile
🙌🙌🙌🙌

0개의 댓글