[CS] GC(Garbage Collector)

Date:

카테고리:

태그:

개요

GC(Garbage Collector)란 메모리 관리 기법 중 하나로 CLR(Common Language Runtime) 이 제공하는 기능이다.

일반적으로 .NET Framework, .NET Core, Java, Python, C#과 같은 언어는 GC를 사용한다. 이와 같이 GC를 사용하는 언어는 대부분 관리 코드 환경에서 사용된다고 하여 Managed 언어라고 한다.

이와 반대되는 언어들은 대표적으로 C, C++ 언어로 UnManaged 언어 이다.

장점

  1. 실수 방지
    • UnManaged 언어 같은 경우 프로그래머가 수동으로 메모리를 관리해야 하기에 실수하면 메모리 누수, 이중 해제, 잘못된 포인터 접근 등 이 발생할 가능성이 있으나, GC를 사용하는 Managed 언어의 경우 스스로 메모리 관리 하기 때문에 실수 가능성이 적다.
  2. 편리한 개발
    • GC가 메모리 관리를 해주기 때문에 프로그래머는 메모리 관리에 대한 복잡한 로직을 작성할 필요가 없어진다. (코드 간소화)
  3. 스레드 안전성
    • GC는 여러 스레드가 동시에 객체 할당 및 해제 작업을 수행할 때, 동기화를 통해 충돌을 방지한다. 이로 인해 스레드 간의 메모리 관리에 대한 복잡한 동기화 작업을 프로그래머가 수행할 필요가 없어지므로 스레드 안전성이 향상된다.

단점

  1. 예측하기 어려운 동작
    • GC는 프로그램 실행 중에 자동으로 작동하며, 프로그래머가 직접 제어할 수 없다. (단 GC 동작을 일부 제어하여 최적화 할 수 있는 방법은 있다.)
  2. 일시적인 지연 현상
    • GC가 수행하기 위해 메모리 상의 사용되지 않는 객체를 식별하고 해제하는 과정을 수행한다. 이 과정에서 메인 스레드를 일시적으로 멈추는데(GC가 안전한 상태에서 메모리 검사를 수행해야 하기 때문이다. 이를 Stop-The-World 라고 한다.) 이로 인해 프로그램의 실행이 잠시 중단되는 현상이 발생한다. 만약 처리 해야할 규모가 커지면 중단 현상이 오래 지속 될 수 있다.

동작 방식

GC 대상

GC는 관리되는 Heap 영역 에서 동적으로 할당했던 메모리 중 더 이상 사용되지 않는 개체(Unreachbale)를 대상으로 회수하는 과정을 수행한다.

GC의 개체 수집 조건

  1. 시스템의 실제 메모리가 부족한 경우

  2. 관리되는 Heap의 할당된 개체에 사용되는 메모리가 허용되는 임계값을 초과한 경우

  3. GC.Collect 메서드가 호출된 경우

    • 거의 모든 경우에 GC가 지속적으로 실행되므로 이 메서드를 호출할 필요가 없다. 이 메서드는 주로 특이한 상황 및 테스트에 사용된다.

이 조건 중 하나가 충족될 경우 발생한다.

알고리즘

GC는 다양한 방식의 알고리즘으로 메모리를 관리 하는데 Generational GC, Serial GC, Parallel GC, CMS GC 등이 있는데 그중에서 일반적으로 많이 사용되는 Generational GC에 대해 알아보려고 한다.

  • Generational GC (세대별 GC)

    세대별 GC는 메모리를 관리하기 위해 세대를 0,1,2 로 나눈다. 대부분의 개체가 짧은 수명을 가지고 있으며 오래된 객체일수록 살아남을 확률이 높다는 가정을 기반으로 동작한다. 이를 활용하여 GC의 효율성을 높인다.

    • 0세대

      • 가장 젊고 수명이 짧은 개체를 포함한다. 수명이 짧은 개체의 예로는 임시 변수가 있다. GC의 개체 수집은 이 세대에서 가장 자주 발생한다. Minor GC 라고도 한다.

      • 대부분의 개체는 0세대 수집에서 회수되며 다음 세대까지 남아 있지 않는다.

    • 1세대

      • 0세대 수집에서 남은 개체들은 이 세대로 승격된다. 이 세대는 수명이 짦은 개체를 포함하며 수명이 짧은 개체와 수명이 긴 개체 사이의 버퍼 역할을 한다. 이 세대 또한 Minor GC에 포함된다.
    • 2세대

      • 1세대 수집에서 남은 개체들이 이 세대로 승격된다. 이 세대는 수명이 긴 개체가 포함된다. 수명이 긴 개체의 예로는 프로세스의 기간동안 유지되는 정적 데이터가 포함된 서버 애플리케이션의 개체가 있다.

      • 0세대, 1세대에 비해 상대적으로 드물게 수행되고 시간도 더 많이 소요된다. Major GC 라고도 한다.

      • 하나의 세대를 수집한다는 것은 해당 세대와 그보다 더 젊은 세대의 개체를 수집한다는 것을 의미한다. 2세대 가지비 수집은 모든 세대에서 개체를 회수하기 때문에 전체 가비지 수집(Full GC)이라고도 한다.

이 알고리즘의 주의점은 세대가 높아질수록 Major GC를 빈번하게, 나아가 Full GC가 발생하기에 이는 곧 성능 문제로 이어질 수 있다. 이를 방지하기 위해 큰 개체나 메모리를 많이 사용하는 경우는 필요한 경우에만 생성하고 해제하거나 등 장기간 메모리를 차지하고 있는 개체가 많이 남아있지 않도록 프로그래머가 관리하는 것도 중요하다.

참고 자료



📚 혼자 공부하면서 기록한 공간입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😉

맨 위로 이동하기

CS 카테고리 내 다른 글 보러가기

댓글 남기기