GC란
가비지 컬렉션(Garbage Collection, GC)은 프로그래밍 언어가 자동으로 메모리 관리를 수행하는 메커니즘을 말합니다.
프로그램이 실행되는 동안 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 부분을 탐지하고 자동으로 해제함으로써 메모리
누수를 방지합니다. Go 언어도 가비지 컬렉션을 지원하며, 이를 통해 개발자는 명시적인 메모리 관리에 대한 부담을 덜 수 있습니다.
메모리 누수는 프로그램이 메모리를 계속해서 사용하지만 더 이상 필요하지 않은 메모리 블록이 해제되지 않는 상황을 의미합니다.
Go 언어의 GC 작동 원리
가비지 컬렉션의 주요 원리는 더 이상 사용되지 않는 메모리를 식별하고 회수하는 것입니다.
이를 위해 가비지 컬렉터는 프로그램 내의 모든 객체 간의 참조 관계를 추적하여 활성 객체와 불필요한 객체를 구별합니다.
이러한 작업은 크게 세 단계로 이루어집니다.
- Mark - 모든 활성 객체들을 표시(Mark)합니다. 이를 통해 어떤 객체가 여전히 참조되고 있는지를 확인합니다.
- Sweep - 표시되지 않은 객체들을 식별하고 해제합니다. 이는 더 이상 사용되지 않는 객체의 메모리를 회수하는 단계입니다.
- Compact(일부 GC에서 수행) - 메모리를 조각내지 않고 빈 공간을 재사용할 수 있도록 메모리를 정리합니다.
그럼 더 이해하기 쉽게 코드로 예시를 들어볼게요.
package main
import "fmt"
func main() {
// 슬라이스에 메모리 할당
slice := make([]int, 0, 10)
// 슬라이스에 값 추가
for i := 0; i < 20; i++ {
slice = append(slice, i)
}
// 슬라이스 출력
fmt.Println("Slice:", slice)
}
위의 예시에서, 슬라이스 slice는 초반에 크기 10의 용량(capacity)을 갖도록 할당되었으나, 반복문을 통해 20개의 값이 추가되었습니다. 이렇게 되면 슬라이스의 용량을 초과하게 되는데, 이후의 추가 값들은 새로운 메모리 영역에 할당됩니다.
이후 가비지 컬렉터가 실행되면 초과된 영역의 메모리는 자동으로 회수됩니다.
이 예시를 통해 Go 언어의 가비지 컬렉션은 개발자가 메모리 관리에 신경 쓰지 않아도 자동으로 메모리 누수를 방지하고 관리할 수 있다는 것을 보여줍니다.
GC의 종류
Go 언어에서는 여러 종류의 가비지 컬렉션을 지원합니다. 가장 기본적인 방법은 GC(pause) 방식으로, 이는 가비지 컬렉션을 실행하기 위해 프로그램을 일시적으로 중지시키는 방식입니다.
또한, Go 1.5 버전부터는 GC(concurrent) 방식도 도입되어 프로그램 중단 없이 가비지 컬렉션을 수행할 수 있게 되었습니다.
Go언어의 동작영역
Go 언어의 가비지 컬렉션은 힙(heap)과 스택(stack) 메모리에서 주로 동작합니다. 힙 메모리에서는 사용되지 않는 객체를 식별하고 정리하여 메모리 누수를 방지하며, 스택 메모리에서는 함수 호출과 관련된 데이터를 추적하여 가비지 컬렉션의 대상으로 포함시킬 수 있습니다. 이러한 가비지 컬렉션의 동작 원리를 이해하면 메모리 관리에 대한 부담을 덜면서도 안정적이고 효율적인 코드를 작성할 수 있게 됩니다.
결론
Go 언어의 가비지 컬렉션은 프로그래머에게 메모리 관리 부담을 덜어주고 안정성과 효율성을 제공하는 중요한 기능 중 하나입니다. 이를 통해 개발자들은 메모리 누수와 같은 문제를 예방하면서도 자유롭게 코드를 작성할 수 있습니다. Go의 가비지 컬렉션 메커니즘은 내부적으로 복잡하지만, 프로그래머들은 대부분의 경우 이에 대해 신경쓰지 않아도 됩니다.
참고자료
- https://dev.to/karankumarshreds/memory-allocations-in-go-1bpa
- https://povilasv.me/go-memory-management/
- https://medium.com/safetycultureengineering/an-overview-of-memory-management-in-go-9a72ec7c76a8
- https://goog-perftools.sourceforge.net/doc/tcmalloc.html
'프로그래밍(Basic) > Golang' 카테고리의 다른 글
defer와 GC의 상관관계 (0) | 2023.05.19 |
---|---|
Go 1.20 릴리즈 요약 (0) | 2023.05.17 |
Go 1.19 릴리즈 (0) | 2023.05.16 |
[바미] Go의 signal에 대해 알아봅시다. (0) | 2022.04.11 |
[바미] Beyond OOP에 대해 알아보자. (0) | 2021.03.02 |