NET (CLR) ํ ๋ฉ๋ชจ๋ฆฌ๊ตฌ์กฐ์ GC ์ ๋ํด์ ๊ทธ๋ฆฌ๊ณ JVM ํ๊ณผ GC์์ ์ฐจ์ด์ ์ ํจ๊ป ์ด์ผ๊ธฐ ํด๋ณด๊ฒ ์ต๋๋ค.
1๏ธโฃํ๋ฉ๋ชจ๋ฆฌ ๊ด์
๐ฆ.NET
.NET์ ํ์ ํฌ๊ฒ ์ฃผ์ํ ๋๊ฐ์ง ์์ญ์ผ๋ก ๋๋์ด์ง๋๋ค. SOH(Small Object Heap), LOH(Large Object Heap) ์ด๋ ๊ฒ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
1. Small Object Heap(SOH, ์์ ๊ฐ์ฒด ํ)
- ํฌ๊ธฐ๊ฐ ์์ ๊ฐ์ฒด(85KB ๋ฏธ๋ง)๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ณธ์ ์ธ ํ ์์ญ
- ์ธ๋(Generation)๋ก ๊ด๋ฆฌ๋ฉ๋๋ค. (Gen 0, Gen 1, Gen 2)
- SOH ์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)๊ฐ ์์ฃผ ์คํ๋ฉ๋๋ค.
2. Large Object Heap(LOH, ๋ํ ๊ฐ์ฒด ํ)
- 85KB(85,000๋ฐ์ดํธ) ์ด์ ํฌ๊ธฐ์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- Gen 2 ์ธ๋์์๋ง ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ด ์คํ๋จ (SOH๋ณด๋ค GC ๋น๋๊ฐ ๋ฎ์)
- ์กฐ๊ฐํ(Fragmentation) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.(์ธ๋ถ ๋จํธํ)
- ์ฃผ๋ก ๋์ฉ๋ ๋ฐฐ์ด(Array), ์ด๋ฏธ์ง ๋ฐ์ดํฐ, JSON/XML ๋ฐ์ดํฐ, ์บ์ ๋ฐ์ดํฐ ๋ฑ์ด ์ ์ฅ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ํ๋ฌ์ค ์ํ๋ก Pinned Object Heap์ด ์์ต๋๋ค.
3. Pinned Object Heap(POH, ๊ณ ์ ๊ฐ์ฒด ํ) (C# 8๋ถํฐ ์ง์)
- GC๊ฐ ์ด๋ํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ํ ๋ณ๋์ ํ ์์ญ
- ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๋๋ ๋ ์ ์ฉํ๋ค๊ณ ํฉ๋๋ค. (์: PInvoke, ๊ณ ์ ๋ ๋ฒํผ)
์์
์์๋ก ๋ค์๊ณผ ๊ฐ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ์ด๋ ์์ญ์ ์ ์ฅ๋ ์ง ์ ์ถํด ๋ณผ ์ ์์ต๋๋ค.
byte[] smallArray = new byte[10_000]; // SOH์ ์ ์ฅ๋จ
byte[] largeArray = new byte[100_000]; // LOH์ ์ ์ฅ๋จ (85KB ์ด์)
LOH ์์ ๊ณ ๋น์ฉ์ GC๊ฐ ์ผ์ด๋๊ณ ์กฐ๊ฐํ ํ์๋ ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํด์ผํฉ๋๋ค.
LOH๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โ 85KB ๋ฏธ๋ง์ด๋ฉด LOH๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก, ํฌ๊ธฐ๊ฐ ์์ ๊ฐ์ฒด๋ ๊ฐ๋ฅํ ํ ์๊ฒ ์ ์ง
โ ๋์ฉ๋ ๋ฐฐ์ด ์ฌ์ฉ ์, ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฐฐ์ด๋ก ๋๋์ด LOH ์ฌ์ฉ์ ์ต์ํ
โ GC ์คํ ์ LOH ์์ถ์ ์ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐํ ๋ฐฉ์ง
โ ๊ธฐ๋ณธ์ ์ผ๋ก .NET GC๋ LOH๋ฅผ ์์ถํ์ง ์์ง๋ง, ๋ช
์์ ์ผ๋ก ์์ถ์ ์คํํ ์ ์์ต๋๋ค.
โ LOH ์์ถ์ ์ํํ๋ฉด, ๋จ์์๋ ๊ฐ์ฒด๋ค์ด ์ฐ์๋ ๊ณต๊ฐ์ผ๋ก ์ ๋ฆฌ๋์ด ์กฐ๊ฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
โ ๋จ, GC ์คํ ๋น์ฉ์ด ํฌ๋ฏ๋ก ์์ฃผ ์คํํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
๐ฉJVM
JVM์ ํ ์์ญ์ ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ์์ง ์์ต๋๋ค. ์ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋๋ ์ด์ ๋ ์ฝํ ์ธ๋ ๊ฐ์ค(Weak Generational Hypothesis)์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฝํ ์ธ๋ ๊ฐ์ค์ด๋
1.๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์ ์ด์ ์ฃฝ๋๋ค.
2. ์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
์ด ๊ฐ์ค์ ๋ฐํ์ผ๋ก Heap ๋ฉ๋ชจ๋ฆฌ์์ Young Generation๊ณผ Old Generation ์์ญ์ด ํ์ํ์ต๋๋ค .
1. Young Generation
- ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
- ํฌ๊ธฐ๊ฐ ์๊ณ , ์๋ช ์ด ์งง์ ๊ฐ์ฒด๋ค์ด ์ฃผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- Eden๊ณผ 2๊ฐ์ง Survivor(From, To) ์์ญ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
Eden ์์ญ์ C#์ GEN0 ๊ณผ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ฉด์ ์ฒ์์ผ๋ก ํ ๋น๋ ๊ฐ์ฒด๊ฐ ์์นํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ดํ๋ก ์ด์ ๋จ๊ฒ ๋๋ฉด Survivor(0, 1) ๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉด ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด Survivor 0 ์์ญ์ ๊ฐ์ฒด๊ฐ ๋ค ์ฐจ๊ฒ ๋๋ฉด ์ฒญ์์์
์ด ์ด๋ฃจ์ด์ง๋ ๋ฐ ์ด๊ฑธ Minor GC ๋ผ๊ณ ํฉ๋๋ค. ๋ณ์์ ์ฐ๊ฒฐ์ด ๋์ด์ ธ ๋์ด์ ์ฐธ์กฐํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์ํค๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Survivor 1 ์์ญ์ผ๋ก ์ฎ๊ธฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์นด์ดํธ ํ์๊ฐ ์ค๋ฅด๊ฒ ๋๊ณ , ์ด๊ณผ์ ์ ๋ฐ๋ณต(0 →1, 1 → 0, 0 → 1 ....)ํ๋ค๊ฐ ์นด์ดํธ์ ์๊ณ๊ฐ์ ๋๊ธฐ๋ฉด Old Generation ์์ญ์ผ๋ก ์ฎ๊ธฐ๊ฒ ๋ฉ๋๋ค.
Young Generation์ GC ์คํ์ด ๋น๋ฒํ๋ฉฐ, ๋น์ฉ์ด ์ ์ต๋๋ค. (Minor GC ์ํ)
2. Old Generation
- ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ผ๋ก Young Generation์์ ์ค๋ซ๋์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ด๋ํ๋ ์์ญ์ ๋๋ค.
- ํฌ๊ธฐ๊ฐ ํฌ๊ณ , ์๋ช ์ด ๊ธด ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋ฉ๋๋ค.
- Old Generation์์ GC ์คํ์ด Young Generation๋ณด๋ค ๋ ๋น๋ฒํ์ง๋ง, ์คํ ๋น์ฉ์ด ํฝ๋๋ค. (Major GC ์ํ)
์ถ๊ฐ์ ์ผ๋ก PermanentGeneration๋ ์์์ง๋ง JVM8 ์ด์๋ถํฐ Metaspace๋ก ๋์ฒด ๋์์ต๋๋ค.
2๏ธโฃ GC
๐ฆ.NET
.NET์ GC๋ ๊ฐ์ฒด๋ฅผ ์์ฑ๋ ์์ ๊ณผ ์์กด ์๊ฐ์ ๋ฐ๋ผ ์ธ ๊ฐ์ ์ธ๋(Generation)๋ก ๊ด๋ฆฌํฉ๋๋ค.
์ด ๋ฐฉ์์ JVM์ Young Generation(Young Gen)๊ณผ Old Generation(Old Gen)๊ณผ ๊ฐ๋
์ ์ผ๋ก ๋น์ทํฉ๋๋ค.
1. Gen 0 (Generation 0)
- ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑ๋ ๊ฐ์ฒด
- ํฌ๊ธฐ๊ฐ ์๊ณ , ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ์งง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ค.
2. Gen 1 (Generation 1)
- Gen 0์์ ์ด์๋จ์ ๊ฐ์ฒด
- ์ค๊ฐ ๋จ๊ณ, ์ค๋ ์ด์๋จ๋ ๊ฐ์ฒด๋ก ์ด๋ ๊ฐ๋ฅํฉ๋๋ค.
3. Gen 2 (Generation 2, Old Gen)
- ๊ฐ์ฅ ์ค๋๋ ๊ฐ์ฒด
- ์ฅ๊ธฐ์ ์ผ๋ก ์ ์ง๋๋ ๊ฐ์ฒด, GC ์คํ ๋น๋๊ฐ ๋ฎ์ต๋๋ค.
๊ฐ์ฒด๊ฐ ์ฒ์ ์์ฑ๋๋ฉด Gen 0์ ํ ๋น๋๊ณ , GC๊ฐ ์คํ๋ ๋ ์ด์๋จ์ ๊ฐ์ฒด๋ Gen 1์ผ๋ก ์ด๋, ์ดํ ๊ณ์ ์ด์๋จ์ผ๋ฉด Gen 2๋ก ์ด๋ํฉ๋๋ค.
๐ฉJVM
JVM ์ ์์์ ๊ฐ๋ตํ๊ฒ ์ค๋ช
ํ ๋ฐ์ ๊ฐ์ต๋๋ค.
1. Young Generation (Young Gen)
- ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- Eden, Survivor(From, To)๋ก ์ธ๋ถํ๋ฉ๋๋ค.
2. Old Generation (Old Gen)
- Young Gen์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์กด์ฌํฉ๋๋ค.
- ์ฅ๊ธฐ๊ฐ ์ ์ง๋๋ ๊ฐ์ฒด์ ๋๋ค.
๋์ ์์
1. ๊ฐ์ฒด ์์ฑ → Eden ์์ญ์ ์ ์ฅ (Young Gen)
2. GC ์คํ ํ ์ด์๋จ์ผ๋ฉด Survivor ์์ญ์ผ๋ก ์ด๋
3. ์ฌ๋ฌ ๋ฒ GC๋ฅผ ํต๊ณผํ๋ฉด Old Generation์ผ๋ก ์ด๋
4. Old Generation์ด ๊ฐ๋ ์ฐจ๋ฉด Major GC(Full GC) ์คํ๋ฉ๋๋ค.
JVM ์์ GC ๋ ๋ฒ์ ์ด ์
๋ ๋๋ง๋ค ์ฌ๋ฌ ์ฐจ๋ก ๋ณํ๋ฅผ ๊ฒช์์ต๋๋ค. ๊ทธ์ค์์ 8์ ๋ฒ ์ดํ ๋ชจ๋ธ์ด ํต์ฌ ๋ชจ๋ธ์ธ๋ฐ์.
Minor GC ์๋ ๋ฉํฐ ์ค๋ ๋ฉ, Major GC ์๋ ๋จ์ผ ์ค๋ ๋ฉ ํ์์
๋๋ค. ์๋ํ๋ฉด ๋ง์ด๋ GC๊ฐ ๋ ๋น๋ฒํ๊ฒ ์ด๋ค์ง๊ณ , ๋ฉ์ด์ GC ๋ ๋น๊ต์ ๋ ์ผ์ด๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ผญ ์ด๋ฐ ํ์๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋๋ค. 21, 17 ๋ฒ์ ๋ฑ์์ ์ฌ๋ฌ GC ํํ๊ฐ ๋์๊ณ ํผ์ฉํ์ฌ ์ฌ์ฉ์ค์
๋๋ค.
GC๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ์ฌ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ์ค์ด๋ ์ฅ์ ์ด ์์ง๋ง, ์๋ ๊ด๋ฆฌ๋ก ์ธํด ์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋ถ์์ฉ์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค.
1. GC ์คํ ํ์ด๋ฐ์ด ์์ธก ๋ถ๊ฐ๋ฅ → ์ฑ๋ฅ ์ ํ (Stop-The-World, STW ๋ฐ์)
2. GC๊ฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ์ง ๋ชปํฉ๋๋ค.
3. ๋น๊ด๋ฆฌ ๋ฆฌ์์ค(ํ์ผ, ์์ผ, DB ์ฐ๊ฒฐ ๋ฑ)๋ GC๊ฐ ๊ด๋ฆฌํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ ์๋น์ค ํน์ฑ์ ๋ฐ๋ผ ์ ์ ํ GC ํ๋์ ์๊ตฌํ ์ ์์ต๋๋ค.
'C# Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C# using ํค์๋๋ก ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ(+ using ์ ์ธ๊ณผ using ๋ฌธ ์ฌ์ฉ์ ์ฐจ์ด) (0) | 2025.04.25 |
---|
๋๊ธ