가비지 컬렉션

jelly·2025년 4월 3일
  1. 가비지 컬렉션의 기본 원리
    언리얼 엔진에서는 모든 UObject(언리얼의 기본 객체)들이 GC 시스템의 관리 대상이 됩니다. UObject의 인스턴스들은 Garbage Collector가 관리하는 루트 집합(Root Set) 내에서 추적됩니다.

🔹 기본 원칙
UObject는 NewObject 또는 SpawnActor 등의 함수로 생성됩니다.

UObject를 참조하는 객체가 없거나, Root Set에 속하지 않으면 GC의 대상이 됩니다.

UObject는 TWeakObjectPtr, TSoftObjectPtr 등을 사용하면 안전하게 참조할 수 있습니다.

TSharedPtr / TUniquePtr은 UObject와 함께 사용하면 안 됩니다. (UObject는 GC가 관리하기 때문)

  1. 가비지 컬렉션의 실행 과정 (Mark-and-Sweep)
    🔹 1) 마크 단계 (Mark)
    Root Set에 있는 객체들을 기준으로 탐색을 시작합니다.

UObject의 멤버 변수나 배열을 따라가면서 참조가 존재하는지 확인합니다.

참조가 남아 있는 객체는 "살아 있음(Reachable)"으로 표시됩니다.

UPROPERTY() 매크로가 붙어 있지 않은 멤버 변수는 GC가 인식하지 못합니다.

🔹 2) 스윕 단계 (Sweep)
"살아 있음"으로 표시되지 않은 객체들을 정리합니다.

BeginDestroy()를 호출하여 객체가 정리될 준비를 합니다.

이후 실제 메모리를 해제하고, UObject가 삭제됩니다.

  1. 가비지 컬렉션에 영향 주는 요소
    ✅ 1) Root Set
    AddToRoot()를 호출하면 UObject가 Root Set에 등록되어 GC 대상에서 제외됩니다.

RemoveFromRoot()를 호출하면 다시 GC의 관리 대상이 됩니다.

✅ 2) UPROPERTY()
UPROPERTY() 매크로를 사용하면 GC가 객체를 자동으로 추적할 수 있습니다.

UPROPERTY()가 없으면 GC가 참조를 인식하지 못해 객체가 삭제될 수 있습니다.

✅ 3) Smart Pointer와 GC
TWeakObjectPtr: 안전하게 UObject를 참조할 수 있지만, 객체가 삭제되면 nullptr이 됩니다.

TSoftObjectPtr: 경로 기반으로 UObject를 참조하는 방식으로, 레벨 스트리밍에 유용합니다.

profile
jelly

0개의 댓글