가비지 컬렉션 (Garbage Collection)

컴퓨터과학·AI
한 줄 정의: 프로그램이 더 이상 사용하지 않는 메모리를 자동으로 찾아내 회수하는 메모리 관리 기법입니다.

쉽게 풀면

방을 쓰다 보면 안 쓰는 물건이 계속 쌓이는데, 매번 직접 치우기는 번거롭습니다. 가비지 컬렉션은 집안 곳곳을 돌아다니며 "이제 아무도 참조하지 않는 물건"을 스스로 찾아내 치워주는 로봇청소기와 같습니다. 프로그램이 실행되는 동안 만들어진 데이터(객체) 중에서 더 이상 어떤 변수도 가리키고 있지 않은 것을 자동으로 찾아 메모리에서 없애줌으로써, 개발자가 일일이 "이 메모리 이제 안 써, 지워도 돼"라고 손수 관리하지 않아도 되게 해줍니다.

왜 중요한가

가비지 컬렉션은 프로그래밍 언어와 런타임 시스템 연구에서 개발 생산성과 실행 성능 사이의 균형을 다루는 핵심 주제입니다. 메모리 관리 실수는 소프트웨어의 안정성과 보안에 직결되기 때문에, 가비지 컬렉션의 효율을 높이는 연구는 대규모 서비스 운영이나 모바일·임베디드 환경의 자원 제약 문제와도 밀접하게 연결됩니다. 이런 이유로 시스템 소프트웨어와 프로그래밍 언어 분야 논문에서 자주 다뤄집니다.

논문에서는 이렇게 쓰입니다

"JVM의 가비지 컬렉션(garbage collection) 방식을 Mark-and-Sweep에서 세대별 수집(generational GC)으로 변경한 결과 응답 지연(latency)이 유의하게 감소했다."

이 문장은 자동 메모리 회수 알고리즘을 바꾸었더니 프로그램이 순간적으로 멈추는 시간(지연)이 줄었다는 성능 개선 결과를 보고한 것입니다.

"모바일 애플리케이션의 배터리 소모를 줄이기 위해 가비지 컬렉션 주기를 애플리케이션의 유휴 상태에 맞추어 조정하는 적응형 스케줄링 기법을 제안하였다."

모바일·임베디드 시스템 연구에서 자원 제약 환경에 맞춘 가비지 컬렉션 최적화를 설명할 때 사용됩니다.

"분산 데이터베이스 시스템에서는 각 노드의 가비지 컬렉션이 서로 다른 시점에 발생하면서 요청 지연의 편차가 커지는 문제가 관찰되었다."

분산 시스템 연구에서 개별 노드의 메모리 관리가 전체 시스템 성능에 미치는 영향을 논의할 때 사용됩니다.

조금 더 깊게 보면

가비지 컬렉션의 구체적인 구현 방식은 언어와 런타임마다 다르며, 참조가 남아있는 객체만 살아있다고 판단하는 마크-앤-스윕, 살아있는 객체를 다른 공간으로 옮겨 메모리를 정리하는 복사(copying) 방식, 순환 참조 문제를 보완하기 위한 참조 카운팅 등이 대표적입니다. 논문에서는 전체 실행 시간 대비 컬렉션에 소요된 시간의 비율(오버헤드), 최대 정지 시간, 메모리 사용량 등을 지표로 삼아 여러 컬렉터를 비교하는 경우가 많습니다.

주의할 점

가비지 컬렉션이 있다고 해서 메모리 누수(memory leak)가 완전히 사라지는 것은 아닙니다. 어딘가에 계속 참조가 남아 있는 객체는 실제로는 더 이상 쓰이지 않아도 회수되지 않고 계속 쌓일 수 있습니다. 또한 회수 작업 자체가 프로세스와 스레드 실행을 잠시 멈추게 할 수 있어, 실시간성이 중요한 시스템에서는 이 지연 시간도 함께 고려해야 합니다.

관련 용어