Garbage Collection

post_thumbnail

  • ์–ธ๋ฆฌ์–ผ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ ์—”์ง„์—์„œ Heap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค
  • UPROPERTY ๋งคํฌ๋กœ๋กœ ์„ ์–ธ๋œ UObject ๊ฐ์ฒด๋“ค์ด ๋Œ€์ƒ์ด๋‹ค
    • int32, float ๋“ฑ์˜ ํƒ€์ž…์€ ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค
  • GC Tick์„ ๋Œ๋ฉด์„œ ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ž‘๋™ํ•œ๋‹ค

๊ฐœ์š”

  • ๋ชจ๋“  UObject์˜ ์ฐธ์กฐ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•œ๋‹ค
    • ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด, ์–ด๋–ค UObject๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ฐธ์กฐ ์—ฌ๋ถ€๋กœ ํŒ๋‹จํ•œ๋‹ค
    • class A๊ฐ€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ class B๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€~
  • Root Set์ด๋ž€ Root ๋ ˆ๋ฒจ์— ํ•ด๋‹นํ•˜๋Š” UObject์˜ ์ง‘ํ•ฉ์ด๋ฉฐ, ์ดํ›„ ์ฐธ์กฐ๋˜๋Š” UObject๋“ค์€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•œ๋‹ค

post_thumbnail

  • CG๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์—”์ง„์€ ROOT์—์„œ ์ถœ๋ฐœํ•ด Tree๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  UObject๋ฅผ ์ถ”์ ํ•œ๋‹ค

post_thumbnail

  • ์ด ์ค‘, ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ์˜ค๋ธŒ์ ํŠธ, ์ฆ‰ ๊ฒ€์ƒ‰ ๊ณผ์ •์—์„œ ์ฐพ์ง€ ๋ชปํ•œ ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ์ œ๊ฑฐํ•œ๋‹ค
    • ์ด๋ฅผ Mark & Sweep๋ผ ํ•œ๋‹ค
    • Root Set์œผ๋กœ๋ถ€ํ„ฐ ์ฐธ์กฐ๋œ Object๋“ค์€ Mark ํ•œ๋‹ค
    • Mark ๋˜์ง€ ์•Š์€ ์˜ค๋ธŒ์ ํŠธ๋“ค์€ Sweepํ•˜๋Š” ๋ฐฉ์‹

์ž‘๋™ ์ˆœ์„œ

  1. GC ์‚ฌ์ดํด ์‹œ์ž‘ (์ดˆ๊ธฐํ™”)
    • GC๊ฐ€ ์‹คํ–‰๋  ์ค€๋น„๋ฅผ ํ•˜๋ฉด์„œ, ์ด์ „์— Reachable๋กœ ๋งˆํ‚น๋œ ๋ชจ๋“  UObject๋“ค์˜ Reachable ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•ด์ œ
    • ๋ชจ๋“  UObject๋Š” ์ž ์ •์ ์œผ๋กœ Unreachable ์ƒํƒœ
  2. Root Set ๋งˆํ‚น
    • Root Set์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Root๋กœ ์ด๋ฃจ์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ
    • GC์˜ โ€œ์ถœ๋ฐœ์ โ€์ธ Root Set์— ๋“ฑ๋ก๋œ ๋ชจ๋“  UObject๋“ค์„ Reachable ์ƒํƒœ๋กœ ๋งˆํ‚น
  3. ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ ๋ฐ Reachable ์ „ํŒŒ
    • Reachable๋กœ ๋งˆํ‚น๋œ ๊ฐ์ฒด๋“ค(Root Set ํฌํ•จ)๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ๋ชจ๋“  UPROPERTY๋กœ ๋ช…์‹œ๋œ UObject* ์ฐธ์กฐ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆœํšŒ
      • ๋ชจ๋“  Root Object๋ฅผ ๋Œ๋ฉด์„œ UPROPERTY๋ฅผ Recursive Search
    • ์ด ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กญ๊ฒŒ ๋ฐœ๊ฒฌ๋˜๋Š” ๋ชจ๋“  UObject ์ธ์Šคํ„ด์Šค๋“ค๋„ Reachable ์ƒํƒœ๋กœ ๋งˆํ‚น
      • ์ด ๊ณผ์ •์—์„œ Pending Kill์ด ์•„๋‹Œ UObject๋“ค์€ Unreachable Mark๋ฅผ ์ง€์›Œ์ค€๋‹ค
      • ์ฆ‰, ์ง€์šฐ์ง€ ์•Š์„ Object๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค
    • ์ด ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด, Root Set์œผ๋กœ๋ถ€ํ„ฐ UPROPERTY ์ฒด์ธ์„ ํ†ตํ•ด ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์ด Reachable๋กœ ๋งˆํ‚น
  4. Unreachable ๊ฐ์ฒด ์‹๋ณ„
    • ์ด์ œ GC๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  UObject ์ธ์Šคํ„ด์Šค๋“ค์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ, ์•„์ง Reachable๋กœ ๋งˆํ‚น๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ์‹๋ณ„
    • ์ด๋“ค์ด ๋ฐ”๋กœ โ€œ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š์•„โ€ Unreachable๋กœ ๋ถ„๋ฅ˜๋œ ๊ฐ์ฒด๋“ค
  5. ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
    • GC๋Š” ์ตœ์ข…์ ์œผ๋กœ Unreachable๋กœ ํŒ๋‹จ๋œ ๋ชจ๋“  UObject๋“ค์˜ ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ
  6. Shrink Hash Table
    • Object Type์„ Key๋กœ ํ•ด์„œ UObject๋“ค์„ ์ €์žฅํ•˜๋Š” Hash Table์ด ์žˆ๋‹ค
    • ์ด Hash Table์„ ์••์ถ•ํ•œ๋‹ค

UObject๋“ค์ด ์ฐธ์กฐ๊ฐ€ ๋Š๊ธฐ๋Š” ์ˆœ๊ฐ„

  • ๋ช…์‹œ์ ์œผ๋กœ nullptr๊ฐ€ ๋Œ€์ž…๋˜๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋กœ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋œ ๊ฐ์ฒด๋“ค
  • ์ƒ์œ„ UObject๊ฐ€ ํŒŒ๊ดด๋  ๋•Œ
  • ์œ„์˜ ๊ฒฝ์šฐ๋“ค์€ ๋” ์ด์ƒ RootSet์„ ํ†ตํ•ด ์ˆœํšŒํ•˜์ง€ ๋ชปํ•œ๋‹ค
  • ์ฐธ์กฐ๊ฐ€ ๋Š๊ธด ์ˆœ๊ฐ„์— ๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค

GC ๊ทœ์น™

  • ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ํ•จ๊ป˜ ํ•˜๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” UPROPERTY๋กœ ์„ ์–ธ
  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ํฌ์ธํ„ฐ๋Š” ํ•ญ์ƒ UObject ํ˜น์€ ๊ฑฐ๊ธฐ์— ๋”ธ๋ฆฐ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ํ•œ์ •ํ•œ๋‹ค

GC ์ฃผ์˜์ 

  • UObject์—์„œ ํŒŒ์ƒํ•œ Raw Pointer ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ UPROPERTY ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
    • GC ๋Œ€์ƒ์œผ๋กœ ๋ถ„๋ฅ˜ ๋ชฉ์ 
  • UObject์—์„œ ํŒŒ์ƒํ•˜์ง€ ์•Š์€ ์˜ค๋ธŒ์ ํŠธ๋Š”?
    • TWeakObjectPtr๊ณผ FWeakObjectPtr์„ ์‚ฌ์šฉํ•œ๋‹ค
    • scalar type๋“ค์€ ๊ด€๋ จ X
  • UObjec*๋ฅผ ๋‹ด๋Š” ๋ฉค๋ฒ„ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด์„œ UPROPERTY ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค
    • TArray๋งŒ UPROPERTY ๋งคํฌ๋กœ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ธ€๋“ค์ด ๋”๋Ÿฌ ์žˆ๋Š”๋ฐ, ์ตœ๊ทผ UE ๋ฒ„์ „์€ TMap์ด๋‚˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋“ค๋„ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค

TWeakObjectPtr

  • UPROPERTY๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์†Œ์œ ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด GC๋˜์ง€ ์•Š๋„๋ก ํ•˜์ง€๋งŒ, ์ด๋Š” ํผํฌ๋จผ์Šค์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์•ผ๊ธฐํ•˜๊ธฐ๋„ ํ•œ๋‹ค
    • ๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B๋ฅผ ๊ฐ•ํ•œ ์ฐธ์กฐ๋กœ ๋ถ™์žก๊ณ  ์žˆ๊ณ  ๊ฐ์ฒด B๊ฐ€ ๋ช…์‹œ์ ์œผ๋Š” Destroy ๋˜์—ˆ๋‹ค๊ณ  ํ•˜์ž
    • ๊ฐ์ฒด A๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ํ•œ, ๊ฐ์ฒด B๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ์‹ค์งˆ์  ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค
    • ์ฆ‰ GC์˜ ํผํฌ๋จผ์Šค๋ฅผ ์ €ํ•˜์‹œํ‚จ๋‹ค
  • Root Set์— ํฌํ•จ๋˜์ง€ ์•Š์•„ ๋น„๋ก GC ๋Œ€์ƒ์œผ๋กœ ๋ถ„๋ฅ˜๋˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ ์–ด๋„ Destroy ์‹œ nullptr๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ IsValid๋กœ ์ •์ƒ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

์ถœ์ฒ˜