가비지 컬렉션에 대해 설명해주세요.

최관수·2023년 9월 18일
0

기술면접

목록 보기
35/58
post-custom-banner

내용 정리

  • C 언어나 C++ 같은 경우에는 수동으로 불필요한 메모리 영역을 해제하는 반면에 자바스크립트는 자동으로 해주는데 그게 가비지 컬렉션, 그걸 수행하는 것이 자바스크립트 엔진 내의 가비지 컬렉터입니다. 가비지 컬렉션을 수행할 때 도달 가능성(reachability) 이라는 개념을 사용하는데, 도달 가능한 값은 메모리에서 삭제되지 않고, 그 외의 값들은 가비지 컬렉터에 의해서 해제가 된다고 볼 수 있습니다.

꼬리 질문

  • 자바스크립트 가비지컬렉션의 장점과 단점에 대해서 설명해주세요
    • 장점은 자동으로 메모리 관리를 해주기 때문에 메모리 관리를 직접 할 필요가 없다는 점이고, 단점은 가비지 컬렉션 시점을 조절할 수 없고 예측하기도 어렵기 때문에 최적의 메모리 관리를 하기는 어렵다는 점입니다.
  • 저수준 언어, 고수준 언어에 대해서 아는 대로 설명해주세요
  • 저수준 언어에는 가비지 컬렉션이 없나요?
  • 고수준 언어의 가비지 컬렉션 과정에 대해서 아는 대로 설명해주세요
    • Mark(표시) 단계, Sweep(정리) 단계, Compact(압축) 단계
  • 자바스크립트에서 가비지 컬렉터는 항상 동작하고 있나요?
  • 자바스크립트는 왜 가비지 컬렉터를 사용하게 됐나요?
    • 자바스크립트는 언어의 설계 철학상 간단하고 사용하기 쉬운 언어로 만들어졌고 편리한 프로그래밍을 목적으로 하고 있습니다. 그래서 개발자가 메모리 관리에 대한 걱정을 덜어낸다는 개념으로 사용하게 된 것으로 알고 있습니다. 그리고 자바스크립트는 근본적으로 개발자가 직접 포인터를 통해 메모리 할당을 할 수 없기 때문에 엄밀히 지정해서 삭제하는 것도 불가능하다고도 볼 수 있습니다.
  • 가비지 컬렉션이 실행되지 않는다면 어떻게 될까요?
  • 도달 가능성에 대해서 설명해주세요
    1. 도달 가능한 객체 (Reachable Objects):

      • JavaScript 엔진은 어떤 객체가 루트(root)로부터 직접 또는 간접적으로 접근할 수 있는지 확인합니다. 루트는 일반적으로 전역 객체(window 또는 global)와 현재 함수의 지역 변수 등입니다.
      • 이러한 도달 가능한 객체들은 가비지 컬렉션에서 제외됩니다.
    2. 도달 불가능한 객체 (Unreachable Objects):
      - 도달 가능한 객체가 아닌 객체는 도달 불가능한 객체로 간주됩니다.
      - 도달 불가능한 객체는 어떤 부모 객체에도 참조되지 않으며, 접근할 수 없습니다.

      가비지 컬렉션은 주기적으로 또는 필요할 때 실행됩니다. 브라우저의 JavaScript 엔진 또는 Node.js와 같은 JavaScript 환경에 따라 실행 시점이 다를 수 있습니다. 주요 실행 시점은 다음과 같습니다:

    3. 참조 카운팅 (Reference Counting):

      • 몇몇 JavaScript 엔진은 참조 카운팅 방식을 사용하여 객체의 참조 수를 추적하고, 참조 수가 0인 객체를 즉시 수집합니다. 이 방법은 주기적으로 실행되지 않으며, 객체에 대한 참조가 추가 또는 삭제될 때마다 실행됩니다.
    4. 마크-스웹 알고리즘 (Mark-Sweep Algorithm):

      • 대부분의 JavaScript 엔진은 가비지 컬렉션을 위해 마크-스웹 알고리즘을 사용합니다.
      • 이 알고리즘은 루트에서 시작하여 도달 가능한 모든 객체를 표시(mark)하고, 그 후 도달할 수 없는 객체를 제거(sweep)합니다. 이 과정은 메모리 부족 상황에서 트리거됩니다.
    5. 세대별 가비지 컬렉션 (Generational Garbage Collection):
      - 일부 JavaScript 엔진은 세대별 가비지 컬렉션을 사용하여 객체를 여러 세대로 나누어 관리합니다. 새로 생성된 객체는 처음 세대에 속하고, 오랫동안 살아남은 객체는 점점 더 오래된 세대로 이동합니다. 이를 통해 가비지 컬렉션의 성능을 최적화할 수 있습니다.

      요약하면, JavaScript의 가비지 컬렉션은 도달 가능한 객체와 도달 불가능한 객체를 판단하고, 그 후 필요한 시점에 실행됩니다. 가비지 컬렉션은 메모리 누수를 방지하고 메모리 관리를 효율적으로 처리하기 위한 중요한 메커니즘 중 하나입니다.

참고자료

스터디 메모

profile
평소엔 책과 영화와 음악을 좋아합니다. 보편적이고 보통사람들을 위한 서비스 개발을 꿈꾸고 있습니다.
post-custom-banner

0개의 댓글