Garbage Collection

- ์ธ๋ฆฌ์ผ์ ์ฌ์ฉ์๊ฐ ์๋ ์์ง์์ Heap ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
- UPROPERTY ๋งคํฌ๋ก๋ก ์ ์ธ๋ UObject ๊ฐ์ฒด๋ค์ด ๋์์ด๋ค
- int32, float ๋ฑ์ ํ์
์ ํด๋นํ์ง ์๋๋ค
- GC Tick์ ๋๋ฉด์ ์๋ ์์๋ก ์๋ํ๋ค
๊ฐ์
- ๋ชจ๋ UObject์ ์ฐธ์กฐ ๊ฐ์๋ฅผ ์นด์ดํ
ํ๋ค
- ์ฐธ์กฐ ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด, ์ด๋ค UObject๊ฐ ์ฌ์ฉ๋๊ณ ์๋์ง ์๋์ง๋ฅผ ์ฐธ์กฐ ์ฌ๋ถ๋ก ํ๋จํ๋ค
- class A๊ฐ ๋ฉค๋ฒ ๋ณ์๋ก class B๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ์~
- Root Set์ด๋ Root ๋ ๋ฒจ์ ํด๋นํ๋ UObject์ ์งํฉ์ด๋ฉฐ, ์ดํ ์ฐธ์กฐ๋๋ UObject๋ค์ ์ฌ๊ธฐ์ ์ถ๊ฐํ๋ค

- CG๊ฐ ๋ฐ์ํ๋ฉด ์์ง์ ROOT์์ ์ถ๋ฐํด Tree๋ฅผ ๊ฒ์ํ๋ฉฐ ์ฐธ์กฐํ๋ ๋ชจ๋ UObject๋ฅผ ์ถ์ ํ๋ค

- ์ด ์ค, ์ฐธ์กฐ๋์ง ์์ ์ค๋ธ์ ํธ, ์ฆ ๊ฒ์ ๊ณผ์ ์์ ์ฐพ์ง ๋ชปํ ์ค๋ธ์ ํธ๋ค์ ์ ๊ฑฐํ๋ค
- ์ด๋ฅผ Mark & Sweep๋ผ ํ๋ค
- Root Set์ผ๋ก๋ถํฐ ์ฐธ์กฐ๋ Object๋ค์ Mark ํ๋ค
- Mark ๋์ง ์์ ์ค๋ธ์ ํธ๋ค์ Sweepํ๋ ๋ฐฉ์
์๋ ์์
- GC ์ฌ์ดํด ์์ (์ด๊ธฐํ)
- GC๊ฐ ์คํ๋ ์ค๋น๋ฅผ ํ๋ฉด์, ์ด์ ์ Reachable๋ก ๋งํน๋ ๋ชจ๋ UObject๋ค์ Reachable ํ๋๊ทธ๋ฅผ ํด์
- ๋ชจ๋ UObject๋ ์ ์ ์ ์ผ๋ก Unreachable ์ํ
- Root Set ๋งํน
- Root Set์ ์ฌ๋ฌ ๊ฐ์ Root๋ก ์ด๋ฃจ์ด์ง ์ปจํ
์ด๋
- GC์ โ์ถ๋ฐ์ โ์ธ Root Set์ ๋ฑ๋ก๋ ๋ชจ๋ UObject๋ค์ Reachable ์ํ๋ก ๋งํน
- ์ฐธ์กฐ ๊ทธ๋ํ ์ํ ๋ฐ Reachable ์ ํ
- Reachable๋ก ๋งํน๋ ๊ฐ์ฒด๋ค(Root Set ํฌํจ)๋ก๋ถํฐ ์์ํ์ฌ, ๋ชจ๋ UPROPERTY๋ก ๋ช
์๋ UObject* ์ฐธ์กฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ํ
- ๋ชจ๋ Root Object๋ฅผ ๋๋ฉด์ UPROPERTY๋ฅผ Recursive Search
- ์ด ์ฐธ์กฐ๋ฅผ ํตํด ์๋กญ๊ฒ ๋ฐ๊ฒฌ๋๋ ๋ชจ๋ UObject ์ธ์คํด์ค๋ค๋ Reachable ์ํ๋ก ๋งํน
- ์ด ๊ณผ์ ์์ Pending Kill์ด ์๋ UObject๋ค์ Unreachable Mark๋ฅผ ์ง์์ค๋ค
- ์ฆ, ์ง์ฐ์ง ์์ Object๋ก ๋ถ๋ฅํ๋ค
- ์ด ๋จ๊ณ๊ฐ ๋๋๋ฉด, Root Set์ผ๋ก๋ถํฐ UPROPERTY ์ฒด์ธ์ ํตํด ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ค์ด Reachable๋ก ๋งํน
- Unreachable ๊ฐ์ฒด ์๋ณ
- ์ด์ GC๊ฐ ๊ด๋ฆฌํ๋ ๋ชจ๋ UObject ์ธ์คํด์ค๋ค์ ํ ๋ฒ ์ํํ๋ฉด์, ์์ง Reachable๋ก ๋งํน๋์ง ์์ ๊ฐ์ฒด๋ค์ ์๋ณ
- ์ด๋ค์ด ๋ฐ๋ก โ๋ ์ด์ ์ฐธ์กฐ๋์ง ์์โ Unreachable๋ก ๋ถ๋ฅ๋ ๊ฐ์ฒด๋ค
- ๋ฉ๋ชจ๋ฆฌ ํด์
- GC๋ ์ต์ข
์ ์ผ๋ก Unreachable๋ก ํ๋จ๋ ๋ชจ๋ UObject๋ค์ ์๋ฉธ์๋ฅผ ํธ์ถํ๊ณ , ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์
- 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๋ก ์ ์์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค
์ถ์ฒ