학습
Ruby 루비의 Garbage Collection
Ruby 루비의 Garbage Collection — 중급
루비의 Garbage Collection
1. 도입 (왜 배워야 하는가)
루비의 Garbage Collection(GC)은 메모리 관리의 핵심 기능으로, 사용하지 않는 객체를 자동으로 정리해줍니다. 실무에서 메모리 누수는 성능 저하와 프로그램의 비정상 종료를 초래할 수 있습니다. 예를 들어, 웹 애플리케이션에서 많은 사용자가 동시에 접속할 경우, 메모리가 비효율적으로 관리된다면 서버가 다운될 위험이 있습니다. GC를 이해하지 못하면 이러한 문제를 해결하기 어려워, 성능 최적화와 안정성을 저해할 수 있습니다.
2. 핵심 개념 설명
Garbage Collection은 사용하지 않는 객체를 자동으로 찾아서 메모리에서 해제하는 과정입니다. 이를 이해하기 위해 실생활의 비유를 들어보겠습니다.
- 비유: 집안 청소를 생각해보세요. 사용하지 않는 물건들을 정리하지 않으면 집안은 점점 어지러워지고, 결국 필요한 물건을 찾기가 힘들어집니다. GC는 이러한 청소 작업을 자동으로 수행하여 메모리를 효율적으로 관리합니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 객체(Object) | 메모리에 할당된 데이터 단위. |
| 메모리 누수(Memory Leak) | 사용하지 않는 객체가 해제되지 않고 남아있는 현상. |
| Mark and Sweep | GC의 한 알고리즘으로, 사용 중인 객체를 표시하고, 사용하지 않는 객체를 정리하는 방식. |
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
코드 한 줄씩 동작 설명
ObjectSpace.memsize_of_all를 사용하여 초기 메모리 사용량을 출력합니다.- 10개의 배열 객체를 생성하여 "Hello, World!" 문자열로 채웁니다.
- 객체 생성 후의 메모리 사용량을 출력합니다.
GC.start를 호출하여 Garbage Collection을 수동으로 시작합니다.- GC 호출 후 메모리 사용량을 다시 출력합니다.
- Garbage Collection은 메모리 관리를 자동으로 수행하여 메모리 누수를 방지합니다.
- GC의 작동 원리를 이해하고 적절히 사용할 필요가 있습니다.
- 루비에서 GC를 수동으로 호출할 수 있으며, 메모리 사용량을 확인할 수 있습니다.
- 다음에 학습하면 좋은 주제는
메모리 최적화 기법과다양한 GC 알고리즘입니다.
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 호출