728x90
반응형
📕오늘의 공부 주제
**GC(Garbage Collector, 가비지 컬렉터)**의 원리, 종류, 동작 방식과 Unity에서의 관련 개념을 정리한다.
🤔Why?
Unity 게임 개발을 하다 보면 **GC가 성능 저하의 원인**이 되는 경우가 많다. 프레임 드랍, 랙 현상 등의 원인을 파악하고 이를 방지하기 위해 GC에 대한 정확한 이해가 필요하다. 또한, 최적화를 위해 어떤 코딩 습관이 GC를 유발하는지를 알고 있어야 한다.
📖오늘의 공부 내용
📌 1. GC란?
- Garbage Collector는 더 이상 사용되지 않는 메모리(객체)를 자동으로 해제하는 시스템이다.
- GC는 메모리 누수를 줄이고 개발자의 부담을 덜어주지만, 자동 동작이기 때문에 예측 불가능한 성능 저하가 발생할 수 있다.
2. GC의 기본 동작 원리
- 루트(Root) 객체부터 탐색 시작
- 참조 가능한 객체를 Mark (사용 중인 메모리)
- 참조되지 않는 객체를 Sweep (수거)
- 필요 시 메모리를 정리하고 Compaction (조각난 메모리 정리)
즉, 참조가 끊긴 객체는 GC 대상이 되고, GC가 실행될 때 메모리에서 제거된다.
3. GC의 종류 (Mono 기준)
| GC 방식 | 설명 |
|---|---|
| Mark and Sweep | 가장 기본적인 방식. 객체를 마킹하고 수거 |
| Generational GC | 객체의 수명을 기준으로 세대를 나누어 관리 |
| Incremental GC | 한 번에 전부 수행하지 않고 나누어서 처리 (유니티 기본 방식) |
| Low Latency GC | 성능을 위해 최소한의 시간 동안만 GC 수행 (Unity 2021 이상에서 옵션 제공) |
4. Unity와 GC
- Unity는 Mono 런타임을 사용하며, GC가 프레임 중간에 멈춤(pause) 을 발생시킬 수 있음
- 주요 GC 유발 원인:
new로 할당한 클래스 객체string연산 (불변이므로 합치면 새 객체 생성됨)- LINQ, foreach,
List.RemoveAll,ToList(),Select()등 Debug.Log()내 포맷 문자열
Struct는 힙이 아닌 스택에 할당되므로 GC 대상이 아님 (단, boxing 주의)
5. GC를 줄이기 위한 팁
- 클래스 대신 구조체(Struct) 사용 (단, 크고 복잡한 구조는 제외)
StringBuilder사용하여 문자열 연결- 반복문 내
new생성 피하기 - 오브젝트 풀링(Object Pooling) 활용
- 캐시된 컬렉션 재사용 (
List.Clear()로 재사용) - LINQ 대신 for문 사용 (특히 업데이트 루프 내에서)
6. GC 동작 확인 방법
- Unity Profiler → Memory → GC Alloc
- Deep Profile 켜면 어느 지점에서 GC가 발생했는지 확인 가능
GC Alloc 수치가 0이 아니면 해당 프레임에서 할당이 발생했다는 뜻
GC.Collect()는 강제로 수거하지만 절대 실시간 게임 루프에 사용하지 말 것
참고
- Unity에서는 Low GC Alloc 프로그래밍이 성능 최적화의 핵심이다.
- 꼭 GC를 없애는 게 목표가 아니라, 불필요한 할당을 줄이는 것이 핵심이다.
728x90
반응형
'프로그래밍 공부 > TIL' 카테고리의 다른 글
| 2025-07-08 TIL (0) | 2025.07.08 |
|---|---|
| 2025-07-07 TIL(면접 준비) (0) | 2025.07.07 |
| 2025-07-02 TIL (0) | 2025.07.02 |
| 2025-06-30 TIL (0) | 2025.06.30 |
| Kata - RGB To Hex Conversion (0) | 2025.06.02 |
