Ractor 로컬 GC의 핵심 난관은 여러 Ractor에서 참조될 수 있는 ‘공유 가능 객체’ 처리입니다. 로컬 GC 시 공유 가능 객체가 참조 없다고 오인되어 해제되면 심각한 버그를 유발합니다. Ractor 간 참조를 실시간으로 정확히 추적하는 것은 병렬 환경에서 매우 복잡하며 성능 오버헤드를 초래합니다. 현재 Ruby는 전역 객체 공간을 사용하며, GC 시 모든 Ractor를 중지해야 하므로 느리고 병렬성을 활용할 수 없습니다.
이를 해결하기 위해 발표자는 보수적인 접근 방식을 제안합니다: 로컬 GC 동안 공유 가능 객체를 ‘항상 살아있는’ 것으로 가정하고 GC 루트로 처리합니다. 이 방식은 대부분의 공유 가능 객체가 수명이 길고 수가 적다는 점을 활용합니다. 안전한 병렬 로컬 GC를 가능하게 하며, 더 이상 참조되지 않는 객체는 필요시 비주기적인 전역 GC를 통해 회수됩니다. 이로 인한 일부 메모리 잔류는 병렬 실행으로 인한 전반적인 성능 향상으로 상쇄됩니다.
마이크로벤치마크 평가 결과, 이 접근 방식은 상당한 성능 개선을 입증했습니다. 짧은 수명 객체 생성 테스트에서 로컬 GC 버전은 16개 Ractor에서 약 5배 속도 향상을, 긴 수명 객체 테스트에서는 4배 이상 향상을 보였습니다. 정규 표현식 매칭에서도 유사한 개선이 관찰되었습니다. 이는 ‘완벽한 것보다 실행하는 것이 낫다’는 통찰을 보여주며, 보수적인 구현만으로도 실질적인 성능 향상이 가능함을 시사합니다.