2025-04-18 GC(Garbage Collector)

강기수·2025년 4월 18일

GC(Garbage Collector)는 프로그램에서 더 이상 사용되지 않는 메모리를 자동으로 회수하는 메모리 관리 시스템이다. 가비지 컬렉터는 주로 동적 메모리 할당을 사용하는 프로그래밍 언어, 예를 들어 C#, Java 등에서 사용된다. 개발자가 메모리를 수동으로 관리하지 않아도 되도록 도와주어, 메모리 누수나 불필요한 메모리 사용을 방지하는 역할을 한다.

가비지 컬렉터의 주요 기능

1. 메모리 관리

객체가 더 이상 사용되지 않으면, 그 객체에 할당된 메모리를 회수하여 다른 객체들이 사용할 수 있도록 한다.

2. 자동 메모리 회수

개발자가 명시적으로 메모리를 해제하지 않아도, 가비지 컬렉터가 불필요한 객체를 자동으로 감지하여 메모리를 회수한다.

3. 메모리 누수 방지

프로그래머가 메모리 해제를 놓친 경우(예: 객체를 참조하는 변수를 제대로 null 처리하지 않았을 때), 가비지 컬렉터가 이를 처리하여 메모리 누수가 발생하지 않도록 한다.

4. 객체의 생명 주기 추적

가비지 컬렉터는 프로그램에서 객체의 참조 관계를 추적한다. 만약 객체가 더 이상 참조되지 않으면, 그 객체는 가비지로 간주되어 회수 대상이 된다.

가비지 컬렉터의 동작 원리

1. 참조 추적

가비지 컬렉터는 객체가 여전히 참조되고 있는지를 추적한다. 객체가 다른 객체에 의해 참조되지 않으면 그 객체는 "쓰레기"가 되어 가비지 컬렉터가 이를 회수한다.

2. 주기적인 실행

가비지 컬렉터는 일정 주기로 실행되며, 메모리 부족을 감지하거나, 백그라운드에서 자동으로 실행된다.

3. 스위핑

가비지 컬렉터는 참조되지 않는 객체를 찾아 메모리에서 제거하는 작업을 한다.

4. 힙(Heap) 영역에서의 작업

대부분의 객체는 힙 영역에 할당되며, 가비지 컬렉터는 이 힙 영역을 주기적으로 스캔하여 참조되지 않는 객체를 정리한다.

가비지 컬렉터의 장점

  • 메모리 관리 자동화: 프로그래머가 직접 메모리를 관리하지 않아도 되므로, 코드가 간결하고 안전해진다.

  • 메모리 누수 방지: 객체가 더 이상 필요 없을 때 자동으로 메모리를 회수하여 메모리 누수 문제를 예방한다.

  • 객체의 생명 주기 추적: 객체가 참조되는 시점에 따라 메모리 할당과 회수를 자동으로 처리한다.

가비지 컬렉터의 단점

  • 예측 불가능한 동작: 가비지 컬렉터가 언제 실행될지 예측할 수 없기 때문에, 실시간 시스템이나 성능이 중요한 시스템에서는 문제가 될 수 있다.

  • 성능 이슈: 가비지 컬렉터가 동작하는 동안 프로그램의 실행이 잠시 멈추거나 성능이 저하될 수 있다. 이를 Stop-the-World 현상이라고 한다.

Stop-the-World 현상이 발생하는 이유

  • 루트 객체(root set) 탐색 시작
    → 프로그램에서 살아 있는 객체들을 추적하려면, 먼저 루트 객체부터 쫓아가야 함
  • 객체 그래프를 순회
    → 각 객체가 누구를 참조하고 있는지 탐색하면서 살아있는 객체들을 구분
  • 쓸모없는 객체 삭제
    → 더 이상 참조되지 않는 객체를 메모리에서 회수

이 모든 과정을 실행하는 동안 프로그램의 다른 코드가 동시에 실행되면 정확한 참조 상태를 알 수 없기 때문에, 가비지 컬렉터는 다른 모든 스레드의 실행을 멈추게 하고 작업을 처리한다.


결론

가비지 컬렉터는 메모리 관리의 자동화를 통해 프로그래밍을 더 안전하고 간단하게 만들지만, 그 동작이 예측할 수 없고 때때로 성능에 영향을 미칠 수 있다는 점에서 주의가 필요하다.

2개의 댓글

comment-user-thumbnail
2025년 4월 18일

와우 기수님,,,하나하나 이렇게 정성스럽게 준비하셨던 거구나! 그래서 저 순찌와 제우스와 감튀교주가 날먹하는 게 싫었던 거구나!! 난 그 마음을 이해해버렸어,,,!! 역시 기수짱 믿고 있었다구!! 주말 동안 보스 몬스터 공격 구현해 주실거져?? 난 기수짱 믿고 있음,,ㅇㅇ

답글 달기
comment-user-thumbnail
2025년 4월 18일

C#만 쓰고 있기에 중요한 정보들을 덕분에 또 알고 갑니다 항상 화이팅입니다!

답글 달기