1. Garbage Collection(GC)์ด๋?
GC๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํด์ฃผ๋ ๊ธฐ๋ฅ
C#, Java ๊ฐ์ ๊ด๋ฆฌํ ์ธ์ด ์์ ์ ๊ณต๋จ
๊ธฐ๋ณธ ๊ฐ๋
- ํ(Heap) ์์ญ์ ํ ๋น๋ ๊ฐ์ฒด ์ค ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํจ
- ์๋ ํด์ ๊ฐ ํ์ ์๋ ๋์ , GC ํ์ด๋ฐ์ ๋ฐ๋ผ ์ฑ๋ฅ ์ ํ ๋ฐ์ ๊ฐ๋ฅ
2. GC ๋์ ๋ฐฉ์ (C# ๊ธฐ์ค)
Mark and Sweep ๋ฐฉ์
1. Mark : ๋ฃจํธ(Root) ๊ฐ์ฒด์์ ์์ํด ์ฐธ์กฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ โ์ด์์๋คโ๊ณ ํ์
2. Sweep : ํ์๋์ง ์์ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ
์ธ๋๋ณ ๊ด๋ฆฌ(Generational GC)
- Generation 0 : ์๋ก ์์ฑ๋ ๊ฐ์ฒด (๋น ๋ฅด๊ฒ ์๊ฑฐ)
- Generation 1 : ์กฐ๊ธ ์ค๋๋ ๊ฐ์ฒด
- Generation 2 : ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด (GC ๋์์์ ์ ์ธ๋๊ธฐ ์ฌ์)
-> ๋๋ถ๋ถ์ GC๋ Gen 0 ๋์์ด ๋ง๊ณ , Gen 2๋ ์ ์ ์ง์์ง
GC Alloc
๋งค ํ๋ ์๋ง๋ค ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ, GC๊ฐ ์์ฃผ ๋ฐ์ํ๋ฉด์ ์ฑ๋ฅ ์ ํ ์ ๋ฐ
GC๊ฐ ์คํ๋๋ ์๊ฐ Stop-the-world(์ ๊น์ ๋ฉ์ถค)์ด ๋ฐ์
GC ๋ฐ์ ์์
void Update() {
string msg = "Score: " + score; // ๋งค ํ๋ ์๋ง๋ค ์ string ์์ฑ โ GC Alloc
}
Unity์์ ์์ฃผ ๋ฐ์ํ๋ GC ์์ธ
1. string ์ฐ๊ฒฐ : ๋ฌธ์์ด์ ๋ถ๋ณ(immutable) ๊ฐ์ฒด๋ผ ์๋ก ๋ง๋ค์ด์ง
2. List<T>.Add() : ๋ด๋ถ ๋ฐฐ์ด์ด ๋์น๋ฉด ์๋ก์ด ๋ฐฐ์ด ์์ฑ
3. foreach : IEnumerator ๋ฐ์ฑ ๋ฐ์ ๊ฐ๋ฅ
4. LINQ ์ฌ์ฉ : ๋ฌด์กฐ๊ฑด ํ ํ ๋น ๋ฐ์
5. ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋๋ค ๋ฑ๋ก ํ ํด์ ์ํจ : ๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ
4. GC ์ต์ํ ์ ๋ต
(1) ๊ฐ์ฒด ํ๋ง (Object Pooling)
- ์์ฃผ ์์ฑ/์ ๊ฑฐ๋๋ ๊ฐ์ฒด๋ ํ๋ก ๊ด๋ฆฌ
- ์ : ์ด์, ์ดํํธ, UI ํ ์คํธ ๋ฑ
Unity์์๋ UnityEngine.Pool.ObjectPool<T> ์ฌ์ฉ ๊ฐ๋ฅ
(2) ๊ตฌ์กฐ์ฒด ์ฌ์ฉ ๋ฐ ๊ฐ ํ์ ํ์ฉ
- ํด๋์ค ๋์ struct ์ฌ์ฉ (ํ ํ ๋น ํผํจ)
- ๋จ, ๊ตฌ์กฐ์ฒด๋ ๋ณต์ฌ ๋น์ฉ ์์ผ๋ ์ ์คํ๊ฒ ์ฌ์ฉ
(3) StringBuilder ํ์ฉ
(4) NativeArray, Job System ์ฌ์ฉ
- Unity DOTS ํ๊ฒฝ์์๋ GC ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ ๊ฐ๋ฅ
- NativeArray, NativeList ๋ฑ์ GC ๋ฐ์ ์์ด ์์
๊ฐ๋ฅ
5. Unity์์ GC ๋ชจ๋ํฐ๋ง ํ
- Profiler -> Memory -> GC Alloc ํ์ธ
- Deep Profiling ์ ์ผ๋ฉด ์ด๋ค ์ฝ๋์์ GC๊ฐ ๋ฐ์ํ๋์ง ์ถ์ ๊ฐ๋ฅ
- Profiler.BeginSample("Tag")์ผ๋ก ์๋ ํ๊น
๊ฐ๋ฅ