가비지 컬렉터(Garbage Collector, GC)는 프로그래밍 언어에서 메모리 관리를 자동화하는 시스템입니다. GC는 더 이상 사용되지 않는 객체나 데이터를 식별하고, 이를 자동으로 해제하여 메모리를 회수합니다. 이를 통해 메모리 누수를 방지하고, 개발자가 메모리 관리에 신경 쓰지 않고 애플리케이션 로직에 집중할 수 있게 합니다.
프로그램이 더 이상 필요로 하지 않는 객체를 해제하지 않으면 메모리 누수가 발생합니다. 메모리 누수는 시스템의 성능을 저하시키고, 결국에는 메모리 부족으로 인해 프로그램이 충돌하거나 비정상적으로 종료될 수 있습니다.
GC를 사용하면 개발자가 명시적으로 메모리를 해제할 필요가 없으므로, 메모리 관리와 관련된 버그를 줄이고 코드 작성에 집중할 수 있습니다.
자동 메모리 관리는 수동 메모리 관리에서 흔히 발생하는 잘못된 메모리 해제, 이중 해제, 해제 후 접근 등의 문제를 방지하여 프로그램의 안정성을 높입니다.
참조 카운팅은 각 객체가 참조되는 횟수를 세고, 참조 카운트가 0이 되면 객체를 해제하는 방식입니다.
마크 앤 스윕은 프로그램의 루트에서 시작하여 모든 도달 가능한 객체를 마크하고, 마크되지 않은 객체를 해제하는 방식입니다.
제너레이션 GC는 객체를 생성된 시기에 따라 여러 세대(generation)로 나누어 관리하는 방식입니다. 일반적으로 젊은 세대와 오래된 세대로 나눕니다.
힙을 두 개의 반으로 나누고, 한 쪽에서 객체를 할당합니다. 가비지 컬렉션이 필요할 때, 살아있는 객체를 다른 반으로 복사하고 현재 반을 비웁니다.
마크 앤 스윕의 변형으로, 스윕 단계에서 살아있는 객체를 한쪽으로 몰아서 힙을 압축합니다.
가비지 컬렉션은 프로그램의 성능에 영향을 미칠 수 있습니다. GC가 실행되는 동안 애플리케이션의 다른 작업이 일시 중단될 수 있으며, 이를 GC 중단(GC pause)라고 합니다. 이러한 중단을 줄이기 위해 다양한 최적화 기법이 사용됩니다.
GC 작업을 애플리케이션의 실행과 동시에 수행하여 중단 시간을 줄입니다. 대표적인 동시성 GC로는 Java의 G1(Garbage-First) GC가 있습니다.
여러 CPU 코어를 활용하여 GC 작업을 병렬로 수행하여 성능을 향상시킵니다.
GC 작업을 여러 단계로 나누어 애플리케이션의 중단 시간을 줄입니다.
가비지 컬렉터는 메모리 관리의 자동화를 통해 개발자의 생산성을 높이고 메모리 누수를 방지하는 중요한 역할을 합니다. 다양한 GC 기법들이 있으며, 각각의 장단점을 이해하고 사용 환경에 맞는 GC를 선택하는 것이 중요합니다. GC의 성능 최적화를 위해 다양한 기법들이 사용되며, 이를 통해 애플리케이션의 안정성과 효율성을 높일 수 있습니다.