GC 스파이크 ( Garbage Collection Spike )
GC ( Garbage Collector ) 는 더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제하는 시스템이다.
그런데 GC가 작동하는 순간에는 모든 쓰레드가 멈추고 , GC 가 메모리 정리 작업을 수행하게 된다.
이때 CPU 점유율이 급상승하거나 프레임 드랍 , 렉이 발생한다.
이런 일시적인 성능 저하 현상을 바로 GC Spike 라고 부른다.
작동 과정
- 프로그램이 계속 객체를 생성한다
- 힙 ( Heap ) 에 메모리가 꽉 차면 GC 가 자동으로 실행
- GC 가 불필요한 객체를 제거
- 이 과정 동안 메인 쓰레드도 일시 정지된다 ( 게임이 잠깐 멈춘 듯한 느낌 )
- GC 완료 후 다시 정상 실행
유니티에서는 GC 스파이크
유니티의 Mono 나 IL2CPP 환경에서도 GC 는 C# 의 관리 메모리를 담당한다.
- new 키워드로 자주 객체를 생성하거나
- string 연결을 반복하거나
- List.Clear( ) 대신 새로운 리스트를 자주 할당
불필요한 Garbage ( 쓰레기 객체 ) 가 많이 생기게 되고
GC Spike 로 인해 프레임 드랍이 발생한다.
1. Heap 메모리에 잦은 할당 / 해제
- Update( ) , FixedUpdate( ) , OnGUI( ) 등 매 프레임마다 새 객체를 생성 ( new ) 하면 GC 가 자주 작동한다.
- 특히 string 연결 , List.Clear( ) 대신 새 List 생성 , 임시 배열 생성 같은 행동이 흔한 원인이다.
void Update()
{
string msg = "Score: " + playerScore; // 매 프레임 string 새로 생성 → GC 잦음
}
2. 박싱 ( Boxing ) 발생
- 값형 ( Value type ) 을 참조형으로 변환할 때 ( int → object ) 임시 메모리 생성이 일어난다.
- string.Format , Debug.Log , foreach ( 구조체 사용 시 ) 등에서 암묵적으로 발생할 수 있다.
Debug.Log("Score: " + score); // int → string 변환 시 Boxing 발생 가능
3. 큰 객체나 배열 생성
한번에 큰 메모리 덩어리를 힙에 올릴 때 , GC 가 이를 관리하기 위해 더 자주 개입하게 된다.
4. 오브젝트 풀링 ( Object Pooling ) 미사용
필요할 때마다 Instantiate / Destroy 반복 시 , 메모리 할당 , 해제가 잦아지고 GC 부담이 급증한다.
5. UI 갱신 시 문자열 조합
TextMeshPro 나 UnityEngine.UI.Text 를 매 프레임 갱신할 때 문자열이 매번 새로 생성된다.
해결 방법
| 원인 | 해결 방법 |
| 잦은 new / Destroy | 오브젝트 풀링 ( Object Pooling ) 사용 |
| 문자열 합치기 | StringBuilder 또는 캐싱된 문자열 사용 |
| Boxing | 형 변환 주의, ToString( ) 최소화 |
| 임시 컬렉션 생성 | 한 번 생성 후 재사용 |
| GC 강제 호출 방지 | Systme.GC.Collect( ) 는 사용 자제 |
| 메모리 사용 분석 | 유니티의 Profiler → Memory 탭 확인 |
정리
GC 스파이크는 메모리 자동 정리 중 모든 실행이 멈춰 생기는 순간적인 끊김이다.
원인은 빈번한 객체 생성 / 해제 / Boxing / 문자열 처리 등에서 일어나고
해결은 오브젝트 풀링 과 재사용이다.
'🧊Unity Basic > 오브젝트풀링' 카테고리의 다른 글
| Object Pooling 핵심 코드 (0) | 2025.10.23 |
|---|---|
| Object Pooling (0) | 2025.10.23 |
| 메모리 사용량 체크 (0) | 2025.10.14 |