Ruby를 개발한 Matz님이 지난 Barcelona Ruby Conference에서 Ruby MRI v2.1을 “Generational Garbage Collection"으로 전환한다고 발표했습니다. Ruby의 대폭적인 성능 향상을 기대할 수 있고, Ruby 2.1은 연말 출시 예정입니다.

공교롭게도 같은 날 다른 강연에서 Github의 Vicent Marti님은 Ruby MRI의 가비지 컬렉션 구현을 강도 높게 비판했습니다. 현재 mark & sweep 알고리즘을 “쌍두 괴물(2-headed monster)“이라고 불렀습니다(mark & sweep은 보통 “표시하고 쓸기"로 번역합니다). 대규모 Ruby 시스템인 Github가 Ruby의 GC 제한 때문에 여러 번 영향을 받았다고 설명했습니다.

문제 중 하나는 marking 단계가 느리다는 것입니다. 활성 objects를 식별할 때 전체 object graph를 순차적으로 순회하기 때문에, application은 그동안 사실상 정지 상태가 됩니다. 또 하나의 문제는 sweeping 단계가 명확하지 않아서 C extensions에서 여전히 사용되고 있는(참조 중인) Ruby objects를 해제해 버릴 수 있다는 점입니다. Vincent님은 Valgrind 같은 도구를 이용하거나 정적 분석을 실시함으로써 이러한 문제를 최소화할 수 있다고 했습니다. 하지만 현재의 Ruby MRI GC 구현에 근본적인 결함이 있다는 점을 강조하면서, 대규모 시스템은 JRuby나 Rubinius로 마이그레이션하기를 추천했습니다. Ruby GC의 기능이 똑같이 구현되어 있기 때문입니다.

New Relic의 Chris Kelly님은 현재의 GC 구현이 느리다는 것에는 동의했습니다. 다만 보통의 Rails 애플리케이션은 수십만 개의 object와 함께 시작하기 위해 GC의 marking 단계가 수행되는 동안 분석 작업이 필요하다는 사실에 주목했습니다(무슨 소린지 모르겠습니다). Ruby GC 벤치마크 결과로는 Ruby 1.8에서 1.9로 가비지 컬렉션 실행 시간이 48% 감소했다는 결과도 공개했습니다. Chris님은 이 결과가 MRI 개발팀이 Ruby 성능 개선에 큰 진전을 이루고 있음을 보여 준다고 했습니다. Matz님에 따르면, generational GC로의 전환이 marking 단계의 실행 시간을 줄여 줄 것으로 기대할 수 있다고 합니다.

https://www.infoq.com/news/2013/09/ruby-2-1-gc-revamp