더북(TheBook)

3.2.2 자동 메모리 관리

하이레벨 언어의 존재 의의는 에러가 발생하기 쉬운 로우레벨 세상의 고된 일을 덜어주는 것이다. 그런 점에서 스토리지를 손으로 일일이 할당/해제하는 것보다 더 지루한 일이 또 있을까? 업무 시간에 동료들과 인사를 나누면서 “오늘 할당할 모든 메모리 바이트에 대해 free() 함수를 호출할 정확한 위치를 알고 싶어 견딜 수가 없네!” 하고 말할 사람이 있을까?

참조 횟수 계산(reference counting)가비지 수집 추적(tracing garbage collection, 보통 가비지 수집(garbage collection), 더 줄여서 GC라고 함)은 메모리 관리의 쌍벽을 이루는 기법이다. 참조 횟수 계산은 구현하기 간단해서 펄(Perl), PHP, 파이썬도 처음에 이 방식을 택했지만, 시간이 지나면서 참조 횟수 계산의 한계가 드러났고 문제가 커졌다. 결국 이들 언어 모두 완전한 GC 기능을 추가하거나, 적어도 객체 사이클을 정리할 수 있을 만큼의 GC를 추가하게 되었다.

실제로, 참조 횟수 계산과 GC는 서로 대립 관계라기보다 연속체(continuum)의 양끝이라고 볼 수 있다. 대부분의 참조 횟수 계산 체계는 사이클을 처리하기 위해 일부 가비지 수집을 추적하고, 세대별 수집기(generational collector)의 쓰기 배리어(write barrier)는 잘 뜯어보면 리테인 콜(retain call)과 비슷해 보인다.

더 자세한 내용은 『A Unified Theory of Garbage Collection』5을 참고하기 바란다.

가비지 수집 추적은 평판이 무시무시하다. 원시 메모리 레벨에서 데이터를 다루는 일은 꽤나 고되다. GC 디버깅을 하면 꿈에 16진수 덤프 파일이 나올지도 모른다! 하지만 이 책의 주제는 마법의 비밀을 풀고 못된 괴물을 물리치는 내용이므로 록스만의 가비지 수집기를 직접 작성할 것이다. 생각보다 알고리즘이 간단하고 구현하는 과정도 흥미진진해서 절대 지루하지 않으리라.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.