๋คํ ๋ถ์
obj dump, FMalloc ํ์คํ ๋ฆฌ, ์ปค์คํ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌํฌํธ๋ก GC ๋ฌธ์ ๋ฅผ ๊น์ด ์ง๋จํฉ๋๋ค
obj dump ๋ช ๋ น์ด
ํน์ UObject์ ์์ธ ํ๋กํผํฐ๋ฅผ ๋คํํ์ฌ ๋ถ์
obj dump ์ฌ์ฉ๋ฒ
// ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ ๋คํ
obj dump MyActor_42
// ์ถ๋ ฅ ์์:
Object: MyActor_42 (Class: AMyActor)
Outer: PersistentLevel
Flags: RF_Transactional
InternalFlags: None
Properties:
Health = 100
MeshComponent = StaticMeshComponent_0
TargetActor = OtherActor_15 โ ์ฐธ์กฐ ํ์ธ!
Inventory = [UItem_0, UItem_1, UItem_2]
// ํด๋์ค ๋จ์ ๋คํ
obj dump class=AMyActor
// Outer ์ฒด์ธ ํ์ธ (์์ ๊ถ ๊ตฌ์กฐ)
// MyActor_42 โ PersistentLevel โ World โ Package
obj dump์์ ํ์ธํ ํต์ฌ ์ฌํญ:
- Outer ์ฒด์ธ: ์์์น ๋ชปํ Outer๊ฐ ์์ผ๋ฉด GC ์๋ช ์ด ๋ฌ๋ผ์ง ์ ์์
- Flags: RF_Standalone์ด ๋ถํ์ํ๊ฒ ์ค์ ๋์ด ์์ง ์์์ง
- ์ฐธ์กฐ ํ๋กํผํฐ: ํ๊ดด๋์ด์ผ ํ ๊ฐ์ฒด๋ฅผ ์ฌ์ ํ ์ฐธ์กฐํ๋์ง
๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ถ์ (FMalloc)
์์ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ๋ฅผ ํ์ฉํ ์ ์์ค ์ถ์
FMalloc ๊ธฐ๋ฐ ์ถ์
// ๋ฉ๋ชจ๋ฆฌ ํ์คํ ๋ฆฌ ์ถ์ ํ์ฑํ
-MallocFrameProfiler // ํ๋ ์๋ณ ํ ๋น ํ๋กํ์ผ๋ง
-MallocLeakReporting // ๋์ ๋ฆฌํฌํธ
// ๋ฐํ์ ๋ฉ๋ชจ๋ฆฌ ํต๊ณ
stat memory
// ์ถ๋ ฅ:
Total Physical: 16384 MB
Used Physical: 8234 MB
Peak Physical: 9120 MB
Used Virtual: 12450 MB
// ๋ฉ๋ชจ๋ฆฌ ๋ฆฌํฌํธ ์ถ๋ ฅ
memreport -full
// ๊ฒฐ๊ณผ ํ์ผ: Saved/Profiling/MemReports/
// MemReport_YYYY-MM-DD_HH-MM-SS.memreport
memreport ํ์ผ ๋ถ์
// memreport ํ์ผ์ ์ฃผ์ ์น์
:
=== UObject Count ===
Total UObjects: 85,234
AStaticMeshActor: 12,500
UStaticMeshComponent: 12,500
UMaterial: 3,200
UTexture2D: 2,800
...
=== Memory by Category ===
UObject Overhead: 45.2 MB
FName Table: 12.8 MB
TArray Slack: 8.4 MB
Texture Memory: 156.4 MB
=== Top Memory Consumers ===
T_LargeTexture_4K: 64.0 MB
SM_ComplexMesh: 32.5 MB
SK_Character: 16.2 MB
์ปค์คํ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌํฌํธ
ํ๋ก์ ํธ ํนํ ๋ฉ๋ชจ๋ฆฌ ์ง๋จ ๋๊ตฌ ๊ตฌ์ถ
์ปค์คํ ๋ฆฌํฌํธ ๊ตฌํ
// ์ปค์คํ
GC ๋ฆฌํฌํธ Exec ๋ช
๋ น
static bool Exec_GCReport(UWorld* World, const TCHAR* Cmd)
{
TMap<UClass*, int32> ClassCounts;
TMap<UClass*, SIZE_T> ClassMemory;
for (FThreadSafeObjectIterator It; It; ++It)
{
UObject* Obj = *It;
ClassCounts.FindOrAdd(Obj->GetClass())++;
FResourceSizeEx Size;
Obj->GetResourceSizeEx(Size);
ClassMemory.FindOrAdd(Obj->GetClass()) +=
Size.GetTotalMemoryBytes();
}
// ๊ฒฐ๊ณผ ์ ๋ ฌ ๋ฐ ์ถ๋ ฅ
ClassCounts.ValueSort([](int32 A, int32 B)
{
return A > B;
});
UE_LOG(LogGC, Warning, TEXT("=== GC Report ==="));
for (auto& Pair : ClassCounts)
{
UE_LOG(LogGC, Warning,
TEXT(" %s: %d objects, %.2f MB"),
*Pair.Key->GetName(),
Pair.Value,
ClassMemory[Pair.Key] / 1024.0 / 1024.0);
}
return true;
}
ํฌ๋์ ๋คํ์์ GC ๋ถ์
ํฌ๋์ ๋คํ ํ์ผ์์ GC ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ง๋จํ๋ ๋ฐฉ๋ฒ
GC ๊ด๋ จ ํฌ๋์ ํจํด
// ํจํด 1: ๋๊ธ๋ง ํฌ์ธํฐ ์ ๊ทผ
Access Violation at 0xDDDDDDDD
// โ UPROPERTY ๋๋ฝ์ผ๋ก GC๋ ๊ฐ์ฒด ์ ๊ทผ
// ํจํด 2: GC ์ค ์ ๊ทผ
Assertion failed: !IsGarbageCollecting()
// โ GC ์งํ ์ค UObject ์์ฑ/ํ๊ดด ์๋
// ํจํด 3: ์ ํจํ์ง ์์ UObject
Fatal: UObject has invalid Flags
// โ ์ด๋ฏธ ํ๊ดด๋ UObject์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฌ์ฉ
// ํจํด 4: FinishDestroy ์ค ํฌ๋์
Crash in UMyObject::FinishDestroy
// โ BeginDestroy์์ ๋ฆฌ์์ค ์ ๋ฆฌ ๋ฏธํก
// ๋๋ฒ๊ฑฐ์์ ํ์ธํ ๊ฒ:
// 1. GUObjectArray์์ ํด๋น ์ธ๋ฑ์ค ํ์ธ
// 2. FUObjectItem์ Flags ํ์ธ
// 3. SerialNumber ์ผ์น ์ฌ๋ถ ํ์ธ
Visual Studio ๋๋ฒ๊ทธ ๋น๋์์ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ 0xDD๋ก ์ฑ์์ง๋๋ค. ์ ๊ทผ ์๋ฐ ์ฃผ์๊ฐ 0xDDDDDDDD ๊ทผ์ฒ์ด๋ฉด ์ด๋ฏธ GC๋ UObject์ ์ ๊ทผํ ๊ฒ์
๋๋ค. UPROPERTY() ๋๋ฝ์ด ๊ฐ์ฅ ํํ ์์ธ์
๋๋ค.
ํต์ฌ ์์ฝ
- obj dump์ผ๋ก ํน์ UObject์ ํ๋กํผํฐ, Outer ์ฒด์ธ, ํ๋๊ทธ๋ฅผ ์์ธํ ๋ถ์ํฉ๋๋ค
- memreport -full๋ก ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฆฌํฌํธ๋ฅผ ํ์ผ๋ก ์ถ๋ ฅํฉ๋๋ค
- ์ปค์คํ GC ๋ฆฌํฌํธ๋ฅผ ๊ตฌํํ์ฌ ํ๋ก์ ํธ ํนํ ๋ฉ๋ชจ๋ฆฌ ์ง๋จ์ด ๊ฐ๋ฅํฉ๋๋ค
- 0xDDDDDDDD ํฌ๋์๋ GC๋ UObject ์ ๊ทผ(UPROPERTY ๋๋ฝ)์ด ์์ธ์ ๋๋ค
- stat memory์ LLM์ ๋ณํํ์ฌ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค
๋์ ๊ณผ์
๋ฐฐ์ด ๋ด์ฉ์ ์ง์ ์ค์ตํด๋ณด์ธ์
memreport -full ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์์ฑ๋ .memreport ํ์ผ์ ๋ถ์ํ์ธ์. UObject ํด๋์ค๋ณ ์ธ์คํด์ค ์, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๊ฐ์ฅ ํฐ ๊ฐ์ฒด ๋ชฉ๋ก์ ์ ๋ฆฌํ๊ณ , ๋น์ ์์ ์ผ๋ก ๋ง์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์๋ณํ์ธ์.
obj dump ๋ช ๋ น์ด๋ก ํน์ UObject์ ์ ์ฒด ํ๋กํผํฐ ๋คํ๋ฅผ ํ์ธํ์ธ์. UPROPERTY ๊ฐ, ์ฐธ์กฐํ๋ ์ธ๋ถ ๊ฐ์ฒด, Object Flags ๋ฑ์ ๋ถ์ํ์ฌ ํด๋น ๊ฐ์ฒด์ GC ๊ด๋ จ ์ํ๋ฅผ ์ข ํฉ์ ์ผ๋ก ํ์ ํ์ธ์.
๋ ์์ ์ memreport๋ฅผ ์๋์ผ๋ก ๋น๊ตํ์ฌ ์๋ก ์์ฑ๋ ๊ฐ์ฒด, ์ญ์ ๋ ๊ฐ์ฒด, ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ/๊ฐ์๋ฅผ ๋ณด๊ณ ํ๋ Python ๋๋ C++ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ์ธ์. ๋ ๋ฒจ ์ ํ ์ ํ์ ๋ฉ๋ชจ๋ฆฌ ๋ณํ๋ฅผ ์๋ ๋ถ์ํ์ธ์.