728x90
반응형

📕오늘의 공부 주제



**GC(Garbage Collector, 가비지 컬렉터)**의 원리, 종류, 동작 방식과 Unity에서의 관련 개념을 정리한다.

🤔Why?



Unity 게임 개발을 하다 보면 **GC가 성능 저하의 원인**이 되는 경우가 많다. 프레임 드랍, 랙 현상 등의 원인을 파악하고 이를 방지하기 위해 GC에 대한 정확한 이해가 필요하다. 또한, 최적화를 위해 어떤 코딩 습관이 GC를 유발하는지를 알고 있어야 한다.

📖오늘의 공부 내용



📌 1. GC란?

  • Garbage Collector더 이상 사용되지 않는 메모리(객체)를 자동으로 해제하는 시스템이다.
  • GC는 메모리 누수를 줄이고 개발자의 부담을 덜어주지만, 자동 동작이기 때문에 예측 불가능한 성능 저하가 발생할 수 있다.

2. GC의 기본 동작 원리

  1. 루트(Root) 객체부터 탐색 시작
  2. 참조 가능한 객체를 Mark (사용 중인 메모리)
  3. 참조되지 않는 객체를 Sweep (수거)
  4. 필요 시 메모리를 정리하고 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