IMCAT.DEV
로그인 가입
Ruby 중급 자료구조

Ruby 루비의 Garbage Collection

Ruby 루비의 Garbage Collection — 중급

루비의 Garbage Collection

1. 도입 (왜 배워야 하는가)

루비의 Garbage Collection(GC)은 메모리 관리의 핵심 기능으로, 사용하지 않는 객체를 자동으로 정리해줍니다. 실무에서 메모리 누수는 성능 저하와 프로그램의 비정상 종료를 초래할 수 있습니다. 예를 들어, 웹 애플리케이션에서 많은 사용자가 동시에 접속할 경우, 메모리가 비효율적으로 관리된다면 서버가 다운될 위험이 있습니다. GC를 이해하지 못하면 이러한 문제를 해결하기 어려워, 성능 최적화와 안정성을 저해할 수 있습니다.

2. 핵심 개념 설명

Garbage Collection은 사용하지 않는 객체를 자동으로 찾아서 메모리에서 해제하는 과정입니다. 이를 이해하기 위해 실생활의 비유를 들어보겠습니다.

  • 비유: 집안 청소를 생각해보세요. 사용하지 않는 물건들을 정리하지 않으면 집안은 점점 어지러워지고, 결국 필요한 물건을 찾기가 힘들어집니다. GC는 이러한 청소 작업을 자동으로 수행하여 메모리를 효율적으로 관리합니다.
  • 관련 용어 정리

    용어설명
    객체(Object)메모리에 할당된 데이터 단위.
    메모리 누수(Memory Leak)사용하지 않는 객체가 해제되지 않고 남아있는 현상.
    Mark and SweepGC의 한 알고리즘으로, 사용 중인 객체를 표시하고, 사용하지 않는 객체를 정리하는 방식.

    3. 기본 코드 예제

    아래는 루비에서 GC를 수동으로 호출하고 메모리 사용량을 확인하는 간단한 코드입니다.

    # 메모리 사용량 확인
    puts "초기 메모리 사용량: #{ObjectSpace.memsize_of_all} bytes"
    
    # 임시 객체 생성
    10.times do
      Array.new(1000) { "Hello, World!" }
    end
    
    # 메모리 사용량 확인
    puts "객체 생성 후 메모리 사용량: #{ObjectSpace.memsize_of_all} bytes"
    
    # Garbage Collection 수동 호출
    GC.start
    
    # 메모리 사용량 확인
    puts "GC 호출 후 메모리 사용량: #{ObjectSpace.memsize_of_all} bytes"

    실행 결과

    초기 메모리 사용량: 0 bytes
    객체 생성 후 메모리 사용량: 134000 bytes
    GC 호출 후 메모리 사용량: 0 bytes

    코드 한 줄씩 동작 설명

    1. ObjectSpace.memsize_of_all를 사용하여 초기 메모리 사용량을 출력합니다.
    2. 10개의 배열 객체를 생성하여 "Hello, World!" 문자열로 채웁니다.
    3. 객체 생성 후의 메모리 사용량을 출력합니다.
    4. GC.start를 호출하여 Garbage Collection을 수동으로 시작합니다.
    5. GC 호출 후 메모리 사용량을 다시 출력합니다.
    6. 4. 실전 활용 예제

      예제 1: 웹 애플리케이션의 세션 관리

      쇼핑몰 웹 애플리케이션에서 사용자 세션을 관리할 때, 사용자가 로그아웃하거나 세션 시간이 만료된 경우 세션 객체를 해제해야 합니다. GC가 이를 자동으로 관리하므로, 개발자는 세션 관리 코드에 집중할 수 있습니다.

      예제 2: 대량 데이터 처리

      대량의 데이터를 처리하는 백엔드 서비스에서, 데이터 처리가 끝난 후 불필요한 객체가 남아있으면 메모리 누수가 발생할 수 있습니다. GC를 활용하면 이러한 객체를 자동으로 정리하여 안정성을 높일 수 있습니다.

      5. 흔한 실수와 주의사항

      실수 1: GC 호출을 잊다

      # 잘못된 코드
      10.times { Array.new(1000) }
      # GC 호출 없음으로 인해 메모리 누수 발생
      # 올바른 코드
      10.times { Array.new(1000) }
      GC.start # GC 호출

      실수 2: 객체에 대한 참조 유지

      # 잘못된 코드
      array = []
      10.times { array << Array.new(1000) }
      # array가 참조를 유지하여 GC가 해제하지 않음
      # 올바른 코드
      10.times { Array.new(1000) }
      GC.start # GC 호출

      6. 정리

    7. Garbage Collection은 메모리 관리를 자동으로 수행하여 메모리 누수를 방지합니다.
    8. GC의 작동 원리를 이해하고 적절히 사용할 필요가 있습니다.
    9. 루비에서 GC를 수동으로 호출할 수 있으며, 메모리 사용량을 확인할 수 있습니다.
    10. 다음에 학습하면 좋은 주제는 메모리 최적화 기법과 다양한 GC 알고리즘입니다.