14. 가비지 컬렉션 알고리즘 비교: 레퍼런스 카운팅 vs Mark-Sweep vs 세대별 GC

난이도 중 해설 보기 →
문제

문제 14 — 가비지 컬렉션 알고리즘 비교: 레퍼런스 카운팅 vs Mark-Sweep vs 세대별 GC

면접 질문

  1. **레퍼런스 카운팅(reference counting)**은 어떻게 동작하는가? 객체가 언제 해제되는지, 그리고 왜 **순환 참조(circular reference)**가 있으면 메모리가 절대 해제되지 않는지 설명하라.

  2. **Mark-Sweep(추적식 GC)**은 어떻게 동작하는가? "루트(root) 집합에서 도달 가능한 객체만 살린다"는 것이 순환 참조 문제를 어떻게 자동으로 해결하는지 설명하라. Mark-Sweep이 레퍼런스 카운팅보다 근본적으로 다른 점(언제 회수 여부를 판단하는가)은 무엇인가?

  3. 세대별(generational) GC는 Mark-Sweep을 어떻게 개선한 것인가? "대부분의 객체는 금방 죽는다"는 가정(weak generational hypothesis)이 왜 전체 힙을 매번 훑는 것보다 효율적인 전략으로 이어지는지 설명하라.

응용 시나리오

세 팀이 각자 다른 언어/전략으로 게임 서버의 인벤토리 시스템을 구현했다.

  • A팀: Python 확장 모듈처럼 직접 레퍼런스 카운팅을 구현. 아이템이 "소유자 캐릭터"를 가리키고, 캐릭터도 "현재 장착 아이템" 목록을 가리키는 상호 참조 구조를 만들었더니, 캐릭터가 로그아웃해도 메모리가 줄지 않는 현상이 발견됐다.

  • B팀: C#(.NET)으로 구현. 평소엔 잘 동작하다가 인벤토리가 매우 커지는 순간(대규모 길드 창고 접근) 수십 ms의 정지(stop-the-world)가 간헐적으로 발생한다.

  • C팀: "우리 언어의 GC는 세대별이라 대부분 Gen 0에서 빠르게 끝난다"고 주장하며 튜닝 없이 그대로 배포했다.

  • A팀의 메모리 누수 원인을 순환 참조 관점에서 설명하고, 이를 해결하는 대표적인 방법(약한 참조 도입, 순환 탐지 GC 병행 등)을 제안하라.

  • B팀이 겪는 정지가 왜 발생하는지, 어떤 세대(Gen 0/1/2)의 GC와 관련 있을 가능성이 높은지, 그리고 정지 시간을 줄이기 위한 접근(백그라운드 GC, 할당률 감소, 객체 풀링 등)을 설명하라.

  • C팀의 주장이 왜 항상 맞지는 않는지, 오래 살아남는 객체(길드 창고 데이터처럼 수명이 긴 객체)가 세대별 GC에서 어떻게 처리되는지, 그리고 그로 인한 비용(카드 테이블, 승격)을 설명하라.

  • 세 사례를 종합해, "게임서버에서 GC 알고리즘 선택/이해가 왜 안정적인 틱 레이턴시에 직접 영향을 주는지" 정리하라.

답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.