면접관련 질문

가비지컬렉터(GC) 최적화 방법

게임만드는학생 2025. 4. 12. 14:15

가비지 컬렉터란 더이상 사용하지 않는 메모리를 자동으로 해제시켜주는 기능이다. 

 

C#에서는 세대별 가비지 컬렉터가 동작하는데, Gen 0, Gen 1, Gen 2 가 있다.

Gen 0 : 새로 생성된 오브젝트,

Gen 1 : Gen 0 에서 살아남은 오브젝트

Gen 2 : 아주 리소스가 큰 오브젝트( 장기 생존 객체 )

 

세대가 낮을수록 (숫자가 작을수록) 수거 빈도가 높다. 

 

그리고 세대가 낮을수록 비용이 적다. 

따라서 Gen 0에서 바로바로 회수되도록 하는 것이 좋다. 

또 아주 리소스가 크다면 애초에 Gen2로 가게끔하고 재사용을 하는 것이 좋다. 

 

따라서 최적화하는 방법에는 

1. 오브젝트 풀링, 즉 객체를 새로만들지 않고 만들어진 것을 재사용하는 것

2. 이벤트 핸들러는 해제해야지만 GC의 대상이 된다. 

3. LOH(Large Object Heap) 즉, 큰 객체는 되도록 피하고 만들면 재사용할 것.

4. class 대신 struct가 가능하면 사용할 것.

이 있다. 

 

또 유니티에서는 Monobehaivor에 따른 생명주기로 관리된다.

 

최적화에는

1. 오브젝트 풀링

2. 박싱 없애기

-> 박싱이란 값타입이 인터페이스, 델리게이트, 오브젝트로 변환될때 발생하는데 

왜냐면 이것들은 참조타입으로 애초에 관리되기 때문이다. 즉, 불필요한 참조가 발생하고

GC의 관리대상이 늘어나게 되므로 이를 최대한 줄여야 한다. 

3. 언박싱은 박싱된 것을 다시 값타입으로 바꾸는데 이러면 가비지가 발생한다.

따라서 언박싱도 없애야한다.

4. 문자열은 immutable이라 바꿀 때마다 새로 생성이 된다. 

따라서 StringBuilder를 사용하는게 좋다. 자주 변환된다면

5. LINQ도 마찬가지로 사용할때마다 매번 GC를 사용하므로 주의가 필요하다.

 

 

'면접관련 질문' 카테고리의 다른 글

유니티 렌더링 파이프라인  (0) 2025.04.12
유니티 유아이 최적화  (0) 2025.04.12
유니티의 이벤트 순서  (0) 2025.04.12