가비지 컬랙션(GC)이란?
- 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 찾아서 해제하는 메모리 관리 시스템
- C#과 같은 언어에서 프로그래머 대신 메모리를 자동으로 관리 해주는 기능
가비지란?
- 사용되지 않는(필요 없는) 메모리를 '가비지' 라고 부르며, 쉽게 말하면 '메모리 쓰레기'이다
- 가비지 컬렉션은 쓰레기 수집이라는 뜻
예시
void Example() {
// 1. 메모리 할당
string name = "Hello";
// 2. 새로운 값 할당
name = "World";
// 이때 "Hello"는 더 이상 참조되지 않는 가비지가 됨
// 3. GC가 주기적으로 실행되어 "Hello" 문자열이 차지하던 메모리를 해제
}
가비지가 발생하는 상황
- 새로운 객체 생성(new 키워드)
- 문자열 연산(+ 연산자로 문자열 합치기)
- 임시 배열, 리스트 생성
- GameObject.Instantiate() 사용
왜 GC가 성능에 영향을 주나?
- GC가 실행될 때 게임이 잠시 멈추는 현상 발생(Stop-the-World)
- 많은 가비지가 쌓일수록 GC 실행 시간이 길어짐
- 특히 모바일 게임에서는 GC로 인한 프레임 드랍이 심각할 수 있음
왜 자동으로 치워주나?
* 메모리 누수 방지
- 프로그래머가 실수로 잊는 거 방지
- 자동으로 관리되므로 메모리 관리 실수가 줄어듦
* 프로그래밍 편의성
- C/C++처럼 직접 메모리를 해제(delete,free)할 필요가 없음
- 개발자가 비즈니스 로직에 더 집중할 수 있음
질문
Q. 다음 코드에서 GC가 발생하는 라인을 찾아보시오
void Update() {
transform.position = new Vector3(0, 0, 0);
string playerName = "Player" + Time.time;
int score = 100;
}
A. new vector3 - 구조체이지만 힙 할당 발생
A. "Player" + Time.time; - 문자열 연산
A. int score =100 - 값 타입이라 스택에 할당
Q. GC가 발생하면 왜 게임이 순간적으로 멈추는 현상이 생길까?
A. Stop-the-world로 인해 모든 게임 스레드가 일시정지하고, 메모리 정리 작업을 진행함
A. 정리할 가비지가 많으면 많을수록 시간이 증가
Q. 다음 상황에서 GC 관련 문제가 발생할 수 있는 코드를 찾아보시오
void Update() {
if(Input.GetKeyDown(KeyCode.Space)) {
GameObject bullet = Instantiate(bulletPrefab);
}
var enemyList = new List<Enemy>();
Debug.Log("Frame: " + Time.frameCount);
}
A. new List<Enemy>(); - 매 프레임마다 불필요한 리스트 생성
A. "Frame: " + Time.frameCount - 매 프레임 문자열 연산
A. 프레임당 최소 2개의 가비지 발생
'유니티 > 패턴, 코드 및 이론 정리' 카테고리의 다른 글
[간단 정리] 다국어 처리 (1) | 2025.01.22 |
---|---|
[간단 정리] JSON (1) | 2025.01.22 |
[패턴] MVC, MVP, MVVM (1) | 2025.01.14 |
[코드] 유한 상태 머신 (0) | 2025.01.11 |