Print Friendly and PDF

유니티/패턴, 코드 및 이론 정리

[간단 정리] 가비지 컬랙션

나는야 개발자 2025. 1. 22. 01:19
반응형

가비지 컬랙션(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