C# Programming

.NET (CLR) ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ GC (๊ทธ๋Ÿฐ๋ฐ JVM ๊ณผ ๋น„๊ต๋ฅผ ๊ณ๋“ค์ธ....)

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2025. 3. 14.

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 ํŠœ๋‹์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€