유니티 GC 발생 원인을 제대로 이해하면 프레임 드랍 문제를 빠르게 해결할 수 있습니다.
유니티 GC는 특정 순간 갑자기 발생하는 것이 아니라, 대부분 코드 패턴에서 반복적으로 만들어집니다.
이제 유니티 가비지 컬렉션을 이해했다면, 가장 중요한 단계로 넘어가 봅시다.
👉 실제로 GC를 발생시키는 코드가 무엇인지 아는 것
많은 경우 GC는 “특정 기능” 때문에 발생하는 것이 아니라,
일상적으로 작성한 코드 때문에 발생합니다.
특히 문제는 이겁니다.
👉 매 프레임 반복되는 코드에서 GC가 발생하는 경우
이 글에서는 유니티에서 GC를 자주 발생시키는 대표적인 코드 패턴을 정리합니다.
유니티 가비지 컬렉션이 위험해지는 순간

👉 GC는 특정 기능이 아니라, 반복되는 코드 패턴에서 만들어집니다.
GC 자체는 문제가 아닙니다.
문제는 “언제 발생하느냐”입니다.
- 로딩 화면 → 괜찮음
- 게임 플레이 중 → 문제
특히 다음 조건이 겹치면 위험합니다.
- Update / LateUpdate / FixedUpdate 내부
- 작은 메모리 할당 반복
- 프레임마다 실행
👉 이 조건이 모이면 GC는 반드시 발생합니다.
1. Update에서 new 객체 생성
가장 흔한 실수입니다.
void Update()
{
var obj = new MyClass();
}
이 코드는 매 프레임마다 새로운 객체를 생성합니다.
이 객체는 곧 사용되지 않기 때문에 GC 대상이 됩니다.
문제는 이 작업이 계속 반복된다는 점입니다.
👉 해결 방법: 객체 재사용 또는 Object Pooling
2. 문자열(string) 연산
문자열은 불변(immutable)입니다.
즉, 문자열을 수정하면 새로운 객체가 생성됩니다.
void Update()
{
string text = "Score: " + score;
}
이 코드는 매 프레임마다 새로운 문자열을 생성합니다.
UI 업데이트에서 자주 발생하는 패턴입니다.
👉 해결 방법: StringBuilder 또는 캐싱
3. LINQ 사용
LINQ는 편리하지만 내부적으로 객체를 생성합니다.
var result = list.Where(x => x > 10).ToList();
이 코드는 중간 객체와 리스트를 생성합니다.
Update에서 사용하면 GC를 유발할 가능성이 큽니다.
👉 해결 방법: for문 사용 또는 캐싱
4. 박싱(Boxing)
값 타입이 object로 변환될 때 박싱이 발생합니다.
int value = 10;
object obj = value;
이 과정에서 힙에 객체가 생성됩니다.
특히 인터페이스, 컬렉션, 로그 출력에서 자주 발생합니다.
👉 해결 방법: 제네릭 사용 또는 타입 명확히 유지
5. foreach 사용 (주의 필요)
모든 foreach가 문제는 아닙니다.
하지만 특정 컬렉션에서는 GC를 발생시킬 수 있습니다.
foreach (var item in list)
{
// 작업
}
특히 struct 기반이 아닌 경우, 또는 boxing이 발생하면 GC가 생길 수 있습니다.
👉 해결 방법: 성능이 중요한 구간에서는 for문 사용
6. 임시 배열 / 컬렉션 생성
void Update()
{
int[] arr = new int[10];
}
이 역시 매 프레임마다 새로운 배열을 생성합니다.
작은 크기라도 반복되면 GC 대상이 됩니다.
👉 해결 방법: 배열 재사용 또는 static 사용
유니티 GC 문제의 핵심 패턴
지금까지 내용을 한 줄로 정리하면 이렇습니다.
👉 “매 프레임 새로운 객체를 만들면 GC는 반드시 발생한다”
즉, 문제가 되는 것은 특정 기능이 아니라 “코드 작성 방식”입니다.
실전 체크 포인트
- Update 안에서 new 사용 여부
- 문자열 연산 반복 여부
- LINQ 사용 위치
- 박싱 발생 여부
- 임시 배열 생성 여부
👉 이 다섯 가지만 확인해도 대부분의 GC 문제를 잡을 수 있습니다.
정리
- 유니티 가비지 컬렉션은 반복되는 할당에서 발생한다
- 특히 Update 내부 코드는 가장 위험하다
- 문제는 “큰 할당”이 아니라 “작은 할당의 반복”이다
👉 GC 문제는 코드 패턴을 바꾸는 것만으로도 대부분 해결됩니다.
다음 글에서 다룰 내용
다음 글에서는 GC를 줄이는 실제 방법을 정리합니다.
👉 Object Pooling, 캐싱, 메모리 관리 전략