[C#] CLR: GC์ ๊ตฌ์กฐ
C#์ Java์ ์นดํผ์บฃ์์ ์์๋ ์ธ์ด๋ค.
๊ทธ๋์ ์ ๋ฐ์ ์ผ๋ก ๋ฒค์น๋งํนํ๊ฑฐ๋ ๋ฎ์ ๋ถ๋ถ์ด ๋ง์๋ฐ, GC๋ ์ด๋ ์ ๋๋ ์ํตํ๋ ๋ถ๋ถ์ด ์์ง๋ง ๋
์์ ์ผ๋ก ๋ฐ์ ํ ๋ถ๋ถ๋ ๋ง๋ค.
์ผ๋จ, C#-CLR์ GC๋ JVM๊ณผ ๋น๊ตํ๋ฉด ๋ฐ์ ์๋๊ฐ ๋๋ ํธ์ด๋ค.
ZGC ๊ฐ์ ์ด๋๊ท๋ชจ-์ ์ง์ฐ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๊ฒ์ ์์ง ์กด์ฌํ์ง ์๋๋ค. ๊ทธ๋์ ์๋ฐฑGB-TB ์์ค์ ๋ฉ๋ชจ๋ฆฌ ํธ๋ค๋ง์๋ ์ค์ง์ ์ธ ์ ์ฝ์ด ์กด์ฌํ๋ค.
์ ์ด์ Java ์์ค์ผ๋ก ๊ฑฐ๋ํ ๋ฉ์ธํ๋ ์์ ์ฌ์ฉ๋ ์ฌ๋ก๊ฐ ๋ง์ง ์์์ ๊ทธ๋ฐ ์๊ตฌ์ฌํญ์ด ๊ฑฐ์ ์์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋๋ ์ญ์ฌ์ ์ธ ํ๋ฆ์ด๋ ๊ธฐ๋ณธ ์๋ฆฌ ๋ฑ์ JVM๊ณผ ๊ณต์ ํ๋ ๊ฒ์ด ๋ง์์ JVM์ GC์ ๋ํด์ ๋จผ์ ์์๋๋ฉด ์ข๋ค.
https://blog.naver.com/sssang97/223575258532
๋ท๋ท CLR์ GC๋ Java๋ Go์ ๋นํ๋ฉด ์ธ๋ถ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ๊ณต๊ฐ๋ ์ ๋ณด๊ฐ ๋ง์ง ์๋ค . ๊ณต์ ๋ฌธ์์๋ ๊ฒํฅ๊ธฐ์์ผ๋ก ๋์ถฉ๋ง ์จ๋จ๋ค. ๊ทธ๋์ ๋ด์ฉ๋ ์ข ๋น์ฝํ ํธ์ด๋ค.
์ธ๋๋ณ(Generational) GC
CLR GC ๋ํ ์ ํต์ ์ธ ์ ์ธ์ ๋ฐ๋ผ์ ์ธ๋๋ณ ๊ตฌ์กฐ๋ฅผ ๊ทผ๊ฐ์ผ๋ก ์ค๊ณ๋์๋ค.
-
๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ฃฝ๊ณ
-
์ค๋ ์์กดํ ๊ฐ์ฒด์ผ ์๋ก ๋ ์ค๋ ์์กดํ๋ค
๋ ๊ฒฝํ์ ๊ทผ๊ฑฐํ ์ด๋ก ๋ง์ด๋ค.
๊ทผ๋ฐ Java๊ฐ ์ธ๋๋ฅผ "๊ตฌ์ธ๋", "์ ์ธ๋" ๋๋ก ๋๋ ๊ฒ๊ณผ ๋์กฐ๋๊ฒ, CLR์ ์ธ๋๋ฅผ 3๊ฐ์ง๋ก ๊ตฌ๋ถํ๋ค.
https://failingfast.io/a-super-simplified-explanation-of-net-garbage-collection/
๋ฌผ๋ก ๋จ๊ณ๋ง ํ๋ ์ถ๊ฐ๋ ๊ฒ์ผ๋ฟ, ์ธ๋ ์ด๋ก ์ ๊ทผ๊ฐ์์ ๋ฒ์ด๋์ง๋ ์๋๋ค.
์ ์ ๊ฐ์ฒด๋ 0์ธ๋์ ํ ๋นํ๊ณ , ์ด์๋จ์ผ๋ฉด 1์ธ๋๋ก ์น๊ฒฉํ๊ณ , ์ค๋ ์ด์๋จ์ผ๋ฉด 2์ธ๋๋ก ์น๊ฒฉํ๋ค.
์์ธ์ ์ผ๋ก ๋งค์ฐ ํฐ ๊ฐ์ฒด๋ 0์ธ๋์ ๋ฃ์ ์๊ณ ๋ํ ๊ฐ์ฒด ํ(Large Object Heap:LOH)์ด๋ผ๋ ๊ณต๊ฐ์ ๊ฒฉ๋ฆฌํด์ ์ ์ฅํ๋ค. ํฐ ๊ฐ์ฒด์ ๊ธฐ์ค์ 85000๋ฐ์ดํธ๋ค.
์๋ฌดํผ ๊ทธ๋์ ๋น๋ฒํ ํด์ ์ ๋ฐ๋ฅธ GC๋ ๋ณดํต 0์ธ๋์์๋ง ์ด๋ฃจ์ด์ง๋ค.
๋ค๋ง 1์ธ๋๋ 2์ธ๋ ๋ฉ๋ชจ๋ฆฌ์ GC๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ฉด, ๊ทธ ํ์ ์ธ๋์ ๋ํ GC๋ ํจ๊ป ์ฒ๋ฆฌ๋๋ค. ์๋ฅผ ๋ค์ด 2์ธ๋ GC๊ฐ ์ํ๋๋ฉด 0,1์ธ๋ GC๋ ํจ๊ป ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
Java์ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์ด๋ถํฐ ์ชผ๊ฐ์ ์ ์ธ๋/๊ตฌ์ธ๋๋ฅผ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ ์ฅํ์๋ค. (G1GC ์ด์ )
๋ท๋ท์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์์ฒด๋ ๊ทธ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ๋จ์ํ๋ค. ๊ทธ๋ฅ Managed Heap์ด๋ผ๊ณ ํด์ ๊ฑฐ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ํ์ค๋ฅผ ํ๋ ๋๊ณ , ๋ฉ๋ชจ๋ฆฌ ํ ๊ฐ๋ ์ผ๋ก ๊ฐ๋ค์ฐ๋ ํํ๋ค.
https://www.microsoftpressstore.com/articles/article.aspx?p=2224054
์ ํ์๋ 0-2์ธ๋์ ๊ฐ์ฒด๋ค์ด ๋ชจ๋ ์์ฌ์์ ์ ์๋ค.
๋ค๋ง, ์์์ ์ธ๊ธํ๋ ๋ํ ๊ฐ์ฒด ํ(LOH)์ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ๋ฐ๋ก ๊ตฌ๋ถ๋๋ค.
๋๋ฌด ํฌ๋ฉด ๊ณต๊ฐ ๊ด๋ฆฌ๊ฐ ์ ๋๋ก ๋์ง ์๊ธฐ ๋๋ฌธ์ 85000๋ฐ์ดํธ๊ฐ ๋๋ ๋ํ ๊ฐ์ฒด๋ ์ธ๋๋ฅผ ๋ฐ์ง์ง ์๊ณ ๊ณง๋ฐ๋ก LOH์ ๋ฐ๋ก ์ ์ฅํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ LOH์ ๋๋นํด์ ๊ธฐ์กด์ 0-2์ธ๋๊ฐ ๋ชจ์ฌ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ํ ๊ฐ์ฒด ํ(Small Object Heap:SOH)์ด๋ผ๊ณ ํ๋ค.
https://failingfast.io/a-super-simplified-explanation-of-net-garbage-collection/
์ด๋ฐ ๋ชจ์์๋ค.
Mark and Swap
ํ๋ GC์ ๊ทผ๊ฐ์ด ๋ ๊ธฐ๋ฒ ์ค ํ๋๋ค.
1960๋
์ ๋ฆฌ์ต์ ์ฐฝ์์ ๋งค์นด์๊ฐ ๋ง๋ค์๋ค.
https://m.blog.naver.com/sssang97/221567636644
Java์์๋ ๋ช๋ช GC ๊ธฐ๋ฒ์ ๋งํฌ์ค ์ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก์ผ๋ ํด์ถ๋ ๋ชจ์์๊ณ , C#์ ์ง๊ธ๋ ์ด๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ํ GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
๋ฃจํธ๊ฐ์ฒด๋ค๋ถํฐ ํ๋ฐํด ๋บ ๋๋ฉด์ ์ฐธ์กฐ๋๊ณ ์๋์ง๋ฅผ ์ฒดํฌํ๊ณ , ์ฐธ์กฐ๋์ง ์์๊ฑธ ์น ์ง์๋ฒ๋ฆฐ๋ค๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค.
๋งค GC ํ์๋ง๋ค ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํ์ค์บํ๋ฉด์ ์ฐ๊ณ , ๋ ํ์ค์บํ๋ฉด์ ์ง์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ปค์ง๋ฉด ๊ฐ๋น์ด ์ ์๋๋ค๋๊ฒ ๋จ์ ์ด๋ค.
๊ฒ๋ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ํํธํ๋ ์ฌํ๋ค. ๊ทธ๋ฅ ์ผ๋จ ์ง์ฐ๊ณ ๋ณด๋๊ฒ ์ต์ข ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ํํธํ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์กฐ๊ฐ๋ชจ์์ ๋ ์ถ๊ฐ๋ก ์ํํด์ผ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ํํธํ๊ฐ ๋์ ๋ ์๋ก ์ฐ์๋ ํฐ ๊ณต๊ฐ์ด ์์ด์ ธ์ ๋น ๊ณต๊ฐ์ ์ฐพ๊ธฐ๋ ํ๋ค๊ณ , ์ถ๊ฐ์ ์ธ ์ ๋ฆฌ์์ ์ด ํ์ํด์ง ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Memory Compact
๋ฐ๋ก ์์์ ์ธ๊ธํ๋ฏ์ด, GC ๊ณผ์ ์์ ์ฐ๋ ๊ธฐ๋ฅผ ํ๋ฒ์ ๋ชจ์์ ์ ๋ฆฌํ๋ค๋ณด๋ฉด ๊ณจ๋ค๊ณต์ฆ ๊ฑธ๋ฆฐ ๊ฒ์ฒ๋ผ ๊ตฌ๋ฉ์ด ์ญ์ญ ๋ซ๋ฆด ์๊ฐ ์๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ํํธํ๊ฐ ๋ฐ์ํ๊ณ , ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ญ์ ์ก๊ธฐ๊ฐ ์ ๋งคํด์ ์ฅ๊ธฐ์ ์ผ๋ก ํ ๋น์ ๋ํ ๋นํจ์จ์ฑ์ด ์ฆ๋ํ๊ฒ ๋๋ค.
๊ทธ๋์ CLR๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ปดํฉ์ ์ ํตํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์๊ฒ ๋ชจ์ผ๋ ์์ ์ ํ๋ค. ๋ณดํต ์ ๋ฆฌ์์ (Sweep)๊ณผ ๋์์ ์คํํ๋ ๊ฒ ๊ฐ๋ค.
๋จ, LOH์ ๊ฒฝ์ฐ์๋ ์์ธ๋ค. ์ด๋ ๋น์ฉ์ด ๋๋ฌด ํฌ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์ ๋นํ ๋น์๋ ์ฑ๋ก ์ฌ์ฌ์ฉ๋ง ํ๋ค. ๋ฌผ๋ก ์ถ๊ฐ ์ต์ ์ ์ฃผ๋ฉด LOH๋ ์ปดํฉ์ ์ ์ํฌ ์๋ ์๋ค.
Stop The World
CLR GC์๋ ๋ชจ๋ GC์ ์กด์ฌํ๋ ์๋ช
, ์ ์ง์๊ฐ์ด ์กด์ฌํ๋ค.
ํต์์ ์ผ๋ก 5~15ms ์ ๋์ ์ ์ง๊ฐ ๋ฐ์ํ๋, ๋ฉ๋ชจ๋ฆฌ ์๋ ฅ์ด ๊ทน๋จ์ ์ด๋ฉด ํจ์ฌ ๋ ๊ธธ์ด์ง ์๋ ์๋ค.
๋ฉ๋ชจ๋ฆฌ ์๋ ฅ ํจํด์ ๋ฐ๋ผ์ ์ด ๋จ์๋ก ๊ฐ ์๋ ์๋ค.
CLR GC์๋ ์์ง ์ ์ง์ฐ์ ๋ณด์ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ํฌํจ๋์ด์์ง ์๋ค.
GC ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ
CLR๋ ์๋ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ํ๋ GC ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์๋ค.
๋ฌผ๋ก ์๋ฐ์ ๋นํ๋ฉด ์ ํ์ง๊ฐ ์ ์ ํธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฆ์ ์ง์ง ์ฌ๋ฏธ์๊ฒ ์ง๋๋ค. ์ ์ด๋ฆ๋ค์ ๋ด๋ผ. ๊ฐ์ฑ์ด ๋๊ปด์ง๋๊ฐ?
1. Concurrent GC (๋ ๊ฑฐ์)
.NET Framework 4๋ถํฐ ๋์ฒด์ฌ์ธ background GC๊ฐ ๋์ค๊ณ ํ๊ธฐ๋จ
**2. Workstation GC **
๊ธฐ๋ณธ๊ฐ. ํด๋ผ์ด์ธํธ ์ฑ ์ ์ฉ.
**3. Server GC **
์๋ฒ ์ ์ฉ.
4. Background GC (Workstation, Server)
.NET Framework 4๋ถํฐ ํฌํจ
CLR: Workstation GC
CLR์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ๊ณตํ๋ GC ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฅด๋ ๋ช ์นญ์ด๋ค.
์ผ๋ฐ์ ์ธ GUI ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ ๋ฑ์ ์ ํฉํ GC ์๊ณ ๋ฆฌ์ฆ์ด๋ค. GC๋ฅผ ์ํ ์ ์ฉ ์ค๋ ๋๊ฐ ๋ฐ๋ก ๋จ์ง ์๊ณ ์ ์ ์ค๋ ๋ ์ค๊ฐ์ค๊ฐ์ ๋ผ์ด์ ํธ์ถ๋๋ค.
๊ทธ๋์ ์ฌ์ค Mark and Sweep๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
GC๊ฐ ๋๋ฉด ๊ทธ๋๋ก Stop The World๋ค. ๋ชจ๋ ๊ฑธ ๋ฉ์ถ๋ค.
https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/workstation-server-gc
๋น ๋ฅธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ํ๊ฒฝ์์๋ ์ ์ ์น ์๊ณ , ๊ฐ๋ํ ํ๊ฒฝ์์ ์ฐ๊ฑฐ๋ ๊ทธ๋ฅ ๋ฆฌ์์ค๋ฅผ ์ ๊ฒ ๋จน๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ ์ฌ์ฉํ๋ค.
CLR: Server GC
๊ณ ์ฑ๋ฅ ์๋ฒ์ฉ์ผ๋ก ์ ๊ณต๋๋ GC ์ต์
์ด๋ค.
์ด๋ฆ๋๋ก ๊ทธ๋ฅ ์๋ฒ ๋์ธ๊ฑฐ๋ฉด ์ด๊ฒ ๊ฐ์ฅ ์ ์ ํ๋ค.
Workstation GC๊ฐ ์ถ๊ฐ ์ค๋ ๋ ์์ด ๋จ์ผ์ค๋ ๋๋ก ๋์ํ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ, ์ด๊ฑด GC๋ง์ ์ํ GC ์ค๋ ๋๋ฅผ ์ฌ๋ฌ๊ฐ ๋์ด๋ค.
.png?type=w800)
https://kimjaehak.github.io/c%23/C-performance-gc/
๊ทผ๋ฐ ๊ทธ๋ ๋ค๊ณ ํด์ ์ ์ง์๊ฐ์ด ์๋๊ฑด ์๋๋ค. GC ์ค๋ ๋๊ฐ ์ฌ๋ฌ๊ฐ ๋จ๊ธด ํ๋๋ฐ, GC๊ฐ ์ ๋ถ ๋๋๊ธฐ ์ ๊น์ง๋ ๋ชจ๋ ๊ฒ ๋ฉ์ถ๋๊ฑด ๋๊ฐ๋ค.
๊ทธ๋์ ๋ฎ์ ์ง์ฐ์๊ฐ์ ๋ณด์ฅํ์ง๋ ๋ชปํ๋ค.
CLR: Background GC
์์์ ์ค๋ช ํ๋ Workstation๊ณผ Server GC๋ ์ฉ๋๋ ๋ค๋ฅด์ง๋ง, GC๋ฅผ ๋๋ฆด๋ ๋ชจ๋ ๊ฑธ ๋ฉ์ถ๋ค๋ ๋จ์ ์ ๋์ผํ๋ค. ๊ทธ๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๋ณด์์ GC ์ต์ ์ด๋ค.
์ด๊ฑด 2์ธ๋ GC์ ํํด์ ๋์์ GC๋ฅผ ์ ๊ณตํ๋ค. ๊ทธ๋์ 2์ธ๋ GC๊ฐ ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ๋ฉ์ถ์ง๋ ์๋๋ค.
๋์ 0-1์ธ๋ GC๋ ๋์์ ์ผ๋ก ์คํํ์ง ์๋๋ค. 0-1์ธ๋ GC๋ ์ฌ์ ํ ์ ์ฒด ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ๋ค. 0-1์ธ๋ GC๋ ๋น๊ต์ ์คํ์๊ฐ์ด ์งง์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค๊ณ ๋ ํ์ง๋ง, ์๋ฌดํผ ์ฌ์ ํ ๋ฉ์ถ๋๊ฑด ๋ง๋ค.
์ด๊ฑด Server์ ๋ํด์๋ ์ฌ์ฉํ ์ ์๊ณ , Workstation์ ๋ํด์๋ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ๊ฐ Background Server GC, Background Workstation GC๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
Server GC๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก Background Server GC๊ฐ ์คํ๋๋ค.
Background Workstation GC์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
ํ๋์ GC ์ค๋ ๋๋ง์ ์ถ๊ฐ๋ก ๋์ฐ๊ณ , ์ค๊ฐ 0-1์ธ๋ GC๋ ์ฌ์ด์ฌ์ด ์คํ
์ ๋ํด์๋ ์ผ์์ค์ง๊ฐ ๋ฐ์ํ์ง๋ง, ์ผ์์ค์ง๊ฐ ๋ฐ์ํ์ง ์๊ณ ๋์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ตฌ๊ฐ๋ ์๋ค.
Background Server GC๋ ๋ฐ๋๋ก GC ์ค๋ ๋๊ฐ ์ฌ๋ฌ๊ฐ ๋จ๋ฉด์, 2์ธ๋ GC๋ฅผ ๋์์ ์ผ๋ก ์ํํ๋ค.
์ด๊ฒ๋ ๋น์ทํ๋ค.
๋ค๋ง ์ผ๋ฐ GC ์ค๋ ๋์ Background๋ง์ ์ํ Background GC ์ค๋ ๋๊ฐ ์ถ๊ฐ๋ก ๋ฌ๋ค๋๊ฒ ๋ค๋ฅด๋ค.
์ผ๋ฐ GC๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ์ฐจ๋จํ๋ Foreground GC๋ฅผ ๋๋ฆฌ๋ ๊ทธ๊ฒ์ด๊ณ , Background GC๊ฐ ๋ถ๋ถ์ ์ผ๋ก๋ง ์ ์ง๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ด๋ค.
https://learn.microsoft.com/ko-kr/dotnet/standard/garbage-collection/fundamentals
https://stackoverflow.com/questions/492703/net-vs-java-garbage-collector
https://failingfast.io/a-super-simplified-explanation-of-net-garbage-collection/
https://stackoverflow.com/questions/64252590/how-does-clr-gc-compare-to-latest-zgc-and-shenandoah-gc-on-jvm
https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/workstation-server-gc