2025-08-31 11:33

Tags: 소프트웨어 공학

가비지 컬렉션

  • 사용하지 않는 메모리를 자동으로 정리해주는 청소

  • ‘Root’에서 시작해 살아있는 객체를 표시(Mark)하고, 표시되지 않은 쓰레기 객체들을 치우는(Sweep) 방식으로 동작

  • 기존 C 나 C++ 같은 언어에서는 메모리를 수동으로 할당하고 해제해야 했다.

  • 이는 개발자에게 완벽한 메모리 통제권을 준다는 장점이 있지만 제대로 다루지 못하면 성능적으로나 보안적으로 매우 위험한 양날의 검

    • 메모리 누수 (Memory Leak): 사용이 끝난 메모리를 해제하지 않아 메모리가 계속 쌓이는 문제. 프로그램이 오래 실행될수록 가용 메모리가 줄어들어 결국 시스템 전체가 느려지거나 멈출 수 있다. (도서관에서 책을 빌리고 반납하지 않는 상황)
    • 댕글링 포인터 (Dangling Pointer): 이미 해제된 메모리 주소를 계속 참조하고 있는 경우. 해당 주소에 새로운 데이터가 할당되면, 의도치 않은 값을 읽거나 써서 프로그램이 비정상적으로 종료될 수 있다. (반납한 책이 있던 자리를 계속 찾아가는 상황)
    • 이중 해제 (Double Free): 이미 해제한 메모리를 또다시 해제하려고 시도하는 문제. (반납한 책을 또 반납하려는 상황)
  • 가비지 컬렉션 은 루트에서 시작해 연결된 모든 객체를 방문 만나면 살아있는거 표시(Mark) 못만나면 쓰레기 쓰레기 청소(Sweep/Compact/Copy)

알고리즘 종류동작 방식장점단점
Mark-and-Sweep살아있는 객체를 표시하고, 나머지를 제거순환 참조 해결, 기본적Stop-the-World, 메모리 파편화
Mark-and-Compact살아있는 객체를 표시하고, 한쪽으로 압축파편화 해결, 메모리 효율 향상객체 이동 비용 발생
Copying힙을 둘로 나눠 살아있는 객체만 복사매우 빠름, 파편화 없음메모리 사용 효율이 절반으로 감소
Generational객체 수명에 따라 영역을 나누어 관리전체적인 GC 성능 및 효율성 극대화구조가 상대적으로 복잡함