본문 바로가기
Study/Go

[Go] GC(Garbage Collection) 심화

by _royJang 2022. 8. 5.

GC

내가 참조하고 있는 글은 2019년에 Go 1.12v 때, 포스팅 된 글 이므로 최근의 Go와 다를 수 있다.

내가 알기론 STW도 제거하기 위해 시도하고 있다고 들었는데.. 이또한 찾아보아야겠다.

 

 


GC 과정

GC가 실행될 때, 세가지의 페이즈가 존재한다. 두가지는 STW 방식이고 한가지는 어플리케이션에 지연을 유발하는 동시성 방식이다. 세가지 페이즈는 순서대로

  • Mark Setup - STW(Stop The World)
  • Marking - Concurrent
  • Mark Termination - STW

이다.

하나씩 살펴보자. 

 

Mark Setup - STW

처음 GC가 실행되면 쓰기를 제한하는 튜닝을 하게되는데 이는 GC 고루틴과 어플리케이션 고루틴의 무결성을 위해서이다. 쓰기를 제한하기 위해 모든 고루틴은 멈춰야만 한다(STW). 이는 매우 순식간에 일어나는데 평균적으로 10~30 마이크로초가 소모된다.

하지만 이 과정에서 문제가 발생할 수 있다. 여러개의 고루틴 중 하나의 고루틴이 멈출 수 없는 단계에 있다면 나머지 고루틴은 그를 위해 계속해서 기다려야 할지도 모른다.

 

Marking - Concurrent

쓰기를 제한하는 튜닝이 종료되면 Marking이 시작된다. GC는 Marking을 하고자하는 그 고루틴을 사용하여 Marking 작업을 실행한다. 하지만 이 과정에 문제가 생긴다면 GC는 다른 고루틴으로 부터 Marking Assist를 모집한다. 이 Marking Assist를 모집하는 속도는 남은 heap 메모리가 차는 속도에 비례한다. 여기서 GC와 Marking Assist에 속하지 않는 고루틴은 본인의 일을 동시적으로 수행한다. GC의 일 중 하나는 이 Marking Assist의 생성을 적게하는 일이다. 만일 많은 수의 Marking Assist가 생성된다면 이를 줄이기 위해 다음 GC는 조금 더 빨리 수행될 것이다.

 

Mark Termination - STW

Marking 작업이 종료되면 다음은 그를 제거하는 일이다. 이 단계는 보통 60~90마이크로초가 소모된다. 그리고 쓰기를 제한하는 튜닝을 제거한다.

 

Sweeping

그리고 이와는 별개로 모든 GC 작업을 마치고 Sweeping 작업을 진행하는데 Marking 단계에서 사용하지 않는다 판단 된 메모리를 제거하는 일이다. 이 일은 GC 의 활동시간에 포함되지 않으며 각 고루틴의 메모리가 재 할당될 때에 일어난다.

 

 

---

 

참조 : https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html

 

Garbage Collection In Go : Part I - Semantics

Our Blog is a great source of insights about Go, also referred as "golang". Our main contributor Bill Kennedy is a renowned Go Trainer, consultant, and author.

www.ardanlabs.com

 

 

+++

Go release note를 살펴본 결과 go의 GC는 1.18버전에서의 수정이 있는데 Marking 단계에서 GC가 관리하는 부분을 non-heap 부분까지 확대시켰다고 한다. 이로써 조금 더 메모리 관리가 수월해 졌지만 더 많은 시간을 사용할 수 있는것에 유의하라는 내용이 있다.