가비지 컬렉션

공부방 책상 위에 다 쓴 연습장과 빈 과자 봉지가 쌓이면 알아서 치워주는 로봇 청소기예요.

정의 컴퓨터 프로그램이 실행되는 동안 더 이상 쓰이지 않는 메모리 공간을 스스로 찾아내어 깨끗하게 비워주는 자동 청소 시스템이에요. 개발자가 일일이 메모리를 반환하지 않아도 컴퓨터가 알아서 여유 공간을 확보해 줘요.

치우지 않고 계속 물건만 꺼내놓는다면

책상에서 공부할 때를 떠올려 볼까요? 새 교재와 연습장을 계속 꺼내 쓰기만 하고 다 본 책을 제자리에 넣지 않으면, 결국 책상이 꽉 차서 새 책을 둘 자리가 없어지죠.

컴퓨터 프로그램도 마찬가지예요. 어떤 작업을 할 때마다 주기억장치(RAM)라는 작업 공간에 데이터를 올려두고 사용해요. 그런데 사용이 끝난 데이터를 치우지 않고 계속 쌓아두면 컴퓨터의 메모리가 꽉 차버리는 현상(메모리 누수, Memory Leak)이 발생해요.

과거에는 프로그래머가 코드에 직접 '이 데이터 다 썼으니 지워줘'라고 일일이 적어야 했어요. 하지만 실수로 지우는 명령을 빠뜨리거나 엉뚱한 데이터를 지워 프로그램이 갑자기 멈추는 오류가 자주 생겼답니다.

쓰레기인지 아닌지 어떻게 구분할까요?

가비지 컬렉터(청소기 역할을 하는 프로그램)는 주기적으로 메모리 공간을 둘러보며 청소할 대상을 찾아요. 이때 쓰레기를 판단하는 기준은 아주 단순해요. 바로 '지금 손이 닿는 물건인가'예요.

프로그램의 실행 코드에서 화살표를 따라가듯 연결된 데이터를 찾아가요. 이를 전문용어로 도달 가능성(Reachability)이라고 불러요. 현재 실행 중인 코드에서 어떤 방법으로도 연결되지 않는 고립된 데이터가 있다면, 아무도 다시 쓸 수 없는 '쓰레기(Garbage)'로 판단하고 지워버려요.

예를 들어 게임에서 몬스터를 물리치면, 화면에서 사라진 몬스터의 데이터는 더 이상 연결되지 않아요. 청소기는 이 연결이 끊긴 몬스터 데이터를 조용히 지워서 다른 새로운 데이터를 담을 빈 공간으로 되돌려 놓는답니다.

가비지 컬렉터의 도달 가능성(Reachability) 기반 메모리 정리 다이어그램 실행 코드 (Root) 데이터 A 데이터 B 데이터 C 쓰레기 A 쓰레기 B 도달 가능 : 메모리 유지 도달 불가 : 자동 삭제

조금 더 정확히 말하면: 공짜 청소는 없어요

가비지 컬렉션 덕분에 프로그래머는 메모리를 비우는 골치 아픈 작업에서 해방되었어요. 자바(Java), 파이썬(Python), 자바스크립트(JavaScript) 같은 현대 프로그래밍 언어들은 대부분 이 기능을 기본으로 갖추고 있죠.

하지만 완벽해 보이는 이 청소 로봇에도 대가가 따라요. 방 전체를 샅샅이 뒤져 쓰레기를 찾는 동안에는 잠시 하던 일을 멈춰야 하거든요. 컴퓨터 분야에서는 이를 세상이 멈춘다(Stop-the-world)라고 표현해요.

아주 짧은 찰나의 멈춤이지만, 0.001초가 중요한 고사양 3D 게임이나 주식 거래 시스템에서는 화면이 버벅거리거나 지연이 생길 수 있어요. 그래서 최고 수준의 성능과 즉각적인 반응이 필요한 시스템(C, C++ 언어 등)에서는 여전히 사람이 직접 메모리를 관리하는 방식을 쓰기도 해요.

🤔 흔한 오해

✕ 오해

가비지 컬렉션이 있는 언어를 쓰면 메모리가 부족해질 일이 전혀 없다.

✓ 사실

프로그램이 실수로 다 쓴 데이터와의 연결을 끊지 않고 계속 쥐고 있으면, 청소기도 쓰레기인지 알 수 없어 지우지 못해요. 이를 '논리적 메모리 누수'라고 불러요.

🧺 일상에서 만나요

1 웹 브라우저 탭을 여러 개 열어뒀다가 닫았을 때, 닫힌 탭이 차지하던 메모리를 가비지 컬렉터가 정리해요.
2 스마트폰 앱을 쓰다가 다른 화면으로 넘어갔을 때 이전 화면의 이미지 데이터를 알아서 비워줘요.
💡 그러니까 한마디로

가비지 컬렉션은 프로그램이 더 이상 쓰지 않는 메모리 데이터를 알아서 찾아 청소해 주는 편리한 자동 관리 시스템이에요.