프로그래밍 일반/Go 프로그래밍

[go] golang의 가비지 콜렉터

지노윈 2024. 11. 13. 11:18
반응형

 

Go 언어(Golang)에서 가비지 컬렉터(Garbage Collector, GC)는 자동으로 메모리를 관리하여 개발자가 직접 메모리 해제를 처리하지 않도록 도와주는 중요한 기능입니다. Go의 가비지 컬렉터는 다중 스레드, 스톱-더-월드(stop-the-world), 분할 수집 방식을 채택하여 동작합니다.

Go의 가비지 컬렉션 특징

Go의 가비지 컬렉션은 Mark-and-Sweep 알고리즘을 기본으로 사용하여 동작합니다. 이 알고리즘은 크게 두 단계로 나눠집니다:

  • Mark 단계: GC는 루트(root)에서부터 시작해 참조가 되는 객체들을 추적하고, 사용 중인 객체에 표시를 합니다.
  • Sweep 단계: 사용되지 않는 메모리를 해제합니다. Mark되지 않은 객체들은 더 이상 사용되지 않는 것으로 판단하여 메모리에서 제거합니다.

주기적 가비지 컬렉션과 스톱-더-월드

Go 가비지 컬렉터는 일정 주기마다 실행되며, 한 번의 가비지 컬렉션이 시작될 때 프로그램의 모든 스레드가 잠시 멈추는 스톱-더-월드 현상이 발생합니다. 초기 Go 언어에서는 이로 인해 지연(latency)이 발생하는 문제가 있었으나, 최근 버전에서는 개선을 통해 이 시간을 최소화하였습니다.

병렬 및 동시 가비지 컬렉션

Go 1.5 버전부터는 병렬 가비지 컬렉션을 도입하여 가비지 컬렉터가 애플리케이션의 다른 작업과 동시(Concurrent)로 작동하도록 했습니다. Go 런타임은 가비지 컬렉터의 일부 작업을 애플리케이션과 병행하여 수행하므로, 성능 저하를 최소화하고 높은 응답성을 유지합니다.

세대별 가비지 컬렉션 미지원

Java 등 일부 언어에서는 세대별 가비지 컬렉션(Generational Garbage Collection)을 사용하는데, 이는 객체의 생애 주기를 기반으로 나누어 관리합니다. 반면 Go는 세대별 가비지 컬렉션을 지원하지 않으며, 모든 객체를 동일하게 취급합니다. 이는 단순한 구조를 유지하고, Go의 특성에 맞게 최적화하기 위함입니다.

가비지 컬렉션 튜닝

Go에서는 가비지 컬렉션을 위한 직접적인 튜닝 옵션이 많지 않지만, GOGC 환경 변수를 통해 가비지 컬렉션 빈도를 조정할 수 있습니다. 기본 값은 100이며, 이는 메모리 사용량이 100% 증가할 때마다 가비지 컬렉션을 수행한다는 의미입니다. 이 값을 조정하여 메모리 사용과 성능 간의 균형을 맞출 수 있습니다.

 

'프로그래밍 일반 > Go 프로그래밍' 카테고리의 다른 글

GORM connection pool  (0) 2024.11.26
[go] golang의 %w  (0) 2024.11.14
[go] go-redis와 Redigo 비교  (0) 2024.11.09
[go] %v와 %+v의 차이  (0) 2024.11.08
[go] Context 활용하기  (0) 2024.11.07