[C#] GC(Garbage Collection)
์ฉ์ด์ ๋ฆฌ
- LOH (Large Object Heap) : 85kb๋ณด๋ค ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น, ๋๋ค์์ ๊ฐ์ฒด๋ค์ด ํ ๋น/ํด์ ๋๋ ๊ณต๊ฐ
- SOH (Small Object Heap) : 85kb๋ณด๋ค ํฐ ์ฌ์ด์ฆ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น
- POH (Pinned Object Heap) : .NET 5.0๋ถํฐ ์ถ๊ฐ๋ ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ(Pinned Memory) ๊ด๋ฆฌ๋ฅผ ์ํ ๊ณต๊ฐ
Garbage Collection ํน์ง
- Garbage Collection์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค์ ํ์์์ด์ง ์์ญ์ ํด์ ํ๋ ๊ธฐ๋ฅ์ด๋ค. ์ค์ฌ์ GC๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- CG๋ ์์คํ ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ์ฐพ์ ์๋์ผ๋ก ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์์์ผ๋ก ํ์ํ๋ ๊ธฐ๋ฅ์ผ๋ก, Garbage Collection์ ์ํํ๋ ๋ถ๋ถ์ Garbage Collector๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- C, C++์ ๊ฐ์ ์ธ์ด๋ ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌ ํด์ค์ผ ํ์ง๋ง, C#, Java์ ๊ฐ์ ์ธ์ด๋ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ๋ฌดํํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ฒ์ฒ๋ผ ๊ฐ๋ฐ์ ํ ์ ์๋๋ก ์ง์ํ๋ค.
Garbage Collection ์ฅ์
- ์ ํจํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๋ฐฉ์ง
- ๋ฉ๋ชจ๋ฆฌ ์ด์ค ํด์ ๋ฐฉ์ง
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
Garbage Collection ๋จ์
- ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋น์ฉ ๋ฐ์
- GC๊ฐ ์ํ๋๋ ์์ ๊ณผ ์๊ฐ์ ์์ธกํ๊ธฐ ์ด๋ ค์
- ๋ฉ๋ชจ๋ฆฌ ํด์ ์์ ์ ์ ์ ์์
C#์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- C# ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉด CLR์ด ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ณตํ๋ค.
- CLR์ ์ํด ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ Managed Heap์ด๋ผ ๋ถ๋ฅธ๋ค.
- CLR์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ ํ๊ธฐ ์ํด ์ธ๋๋ฅผ ๋๋๋ค. (์ธ๋๊ฐ ๋ฎ์์๋ก(0์ธ๋์ ๊ฐ๊น์ธ์๋ก) ๋ฉ๋ชจ๋ฆฌ์์ ๋นจ๋ฆฌ ํด์ ๋จ)
0์ธ๋ : ์ต๊ทผ์ ์์ฑ๋ ๊ฐ์ฒด
1์ธ๋ : 1ํ์ GC๋์ ์ด์๋จ์ ๊ฐ์ฒด
2์ธ๋ : 2ํ ์ด์์ GC ๋์ Heap ์์ญ์ ์ ์ฅ๋์ด์๋ ๊ฐ์ฒด
- C#์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ฆ์ ๋ฐ๋ผ SOH, LOH, POH๋ก ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌํ๋ค.
- SOH๋ GC ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- LOH๋ GC์์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ปดํฉ์ ์ด ๋ฐ์ํ์ง ์๋๋ค. (์ฉ๋์ด ํฐ ๊ฐ์ฒด์ ๊ฒฝ์ฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ๋ฐฐ์น์ ๋ํ ์ค๋ฒํค๋๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ 2์ธ๋ GC์์๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ )
- POH : Pinned Memory๋ ๋ฉ๋ชจ๋ฆฌ ํฌ์ธํฐ๋ค์ ๊ณ ์ ์์ผ GC์์ ๋ฉ๋ชจ๋ฆฌ ์์ถ์ ํ์ง ๋ชปํ๋๋ก ๋ฐฉํดํ์ฌ ๋ฐ์ดํฐ ๋จํธํ๋ฅผ ์ ๋ฐํ๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด์ํ๊ธฐ ์ํด .NET 5.0 ๋ถํฐ ์ถ๊ฐ๋ Heap (GC.AllocateArray๋ฅผ ํตํด์ Blittable ํ์๋ง์ ํ ๋นํ ์ ์๋๋ก ์ ํ๋์ด ์์)
C#์ Garbage Collection
- CLR์์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ด๋นํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์กด์ฌํ๋ค.
- C#์ผ๋ก ์์ฑ๋ ์ฝ๋๋ ๊ด๋ฆฌํ ์ฝ๋(Managed Code)์ ์ํ๋ฉฐ CLR์ด ํด๋น ์ฝ๋์ ๋ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ์ค๋ ๋ฉ ๋ฑ์ ๊ด๋ฆฌ์ ํจ๊ป ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ญํ ๋ ์ฑ ์์ง๋ค. unsafe ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋น ๊ด๋ฆฌํ ์ฝ๋(Unmanaged Code)๋ก ๊ตฌ์ฑํ ์ ์์ง๋ง CLR์ ๊ด๋ฆฌ๋ฅผ ๋ฐ์ ์ ์๋ค.
C# Garbage Collection Methods
- C#์์ ์ง์ํ๋ GC์ Methods๋ ์๋์ ๊ฐ๋ค.
Method | ๊ธฐ๋ฅ |
CG.Collect() | ๋ชจ๋ ์ธ๋(0~2์ธ๋)์ GC ์ฆ์ ์ํ |
GC.Collect(int) | 0์ธ๋์์ ์ง์ ๋ ์ธ๋๊น์ง์ GC ์ฆ์ ์ํ |
GC.CollectionCount(int) | ์ง์ ๋ ์ธ๋์ ๊ฐ์ฒด์ ๋ํ์ฌ GC๊ฐ ์ํ๋ ํ์ ๋ฐํ (GC ์ํ ๋ชจ๋ํฐ๋ง์ ์ํด ์ฌ์ฉ) |
GC.GetGeneration(object) | Object์ ํ์ฌ ์ธ๋ ๋ฐํ |
GC.MaxGeneration | ํ์ฌ ์ง์ํ๋ ๊ฐ์ฅ ํฐ ์ธ๋ ๋ฒํธ๋ฅผ ๋ฐํ |
GC ํจ์จ์ฑ ํฅ์ ๋ฐฉ๋ฒ (๋ฉ๋ชจ๋ฆฌ ์ต์ ํ)
- C#์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํตํด GC ํจ์จ์ฑ์ ํฅ์์ํฌ ์ ์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ํ์ ์ผ๋ก ์๋์ ๊ฐ๋ค.
1. string ์ฌ์ฉ ์, + ์ฐ์ฐ์๋ณด๋ค StringBuilder ์ฌ์ฉ ๊ถ์ฅ
- + ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ๊ธฐ์กด ๊ฐ์ฒด๋ ์ฐธ์กฐ ์์ด ๋ฉ๋ชจ๋ฆฌ์ ์์ด๊ฒ ๋๋ค.
2. ๋ฐ์ฑ/์ธ๋ฐ์ฑ ์ ์
- ๊ฐ ํ์ → ์ฐธ์กฐ ํ์ , ์ฐธ์กฐ ํ์ → ๊ฐ ํ์ ์ผ๋ก ๋ณํํ๋ ์์ ์ ๋๋ฆฌ๊ณ ๊ถ์ฅํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค. ํด๋น ์์ ์ด ์ผ์ด๋ ๋๋ง๋ค Heap ๋ฉ๋ชจ๋ฆฌ์ ์์ด๊ณ ๊ฐ์ด ๋ณต์ฌ๋๋ค.
3. using ํค์๋ ์ฌ์ฉ
- using ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ดํธ {} ๋ฅผ ๋น ์ ธ๋์ฌ ๋ ์๋์ผ๋ก Dispose๋ฅผ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
4. ๋ถํ์ํ List ์ฌ์ฉ ์ต์ํ
- C#์ List๋ Linked List๊ฐ ์๋ ArrayList์ ๊ฐ์ ํํ๋ก ๊ตฌ์ฑ๋์ด์๋ค. List์ ๋ฐ๋ณต์ ์ธ Add, Remove ๋์์ ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ๋ณต์ฌํ๋ ๊ตฌ์กฐ์ด๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ทจ์ฝํ๋ค.
5. Class ๋จ์ผ ์์น
- ํ๋์ CSํ์ผ์๋ ํ๋์ Class๋ง ์ ์ํ๋ค.
6. string ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ๋น๊ต ํ ๋ Compare ํจ์ ์ฌ์ฉ
- string์ ๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ToUpper(), ToLower() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค๊ฒ๋์ด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ทจ์ฝํ๋ค. string.Compare() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ฐ์ดํฐ ๋น๊ต๊ฐ ๊ฐ๋ฅํ๋ค.
7. ๋ณต์กํ ์ฐธ์กฐ ๊ด๊ณ ์์ฑ ์ํจ
- ๋ณต์กํ ์ฐธ์กฐ ๊ด๊ณ์์ GC๊ฐ ์ํ๋๋ฉด ์ฐธ์กฐํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ถ ์์ ํ๋ฉฐ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
8. ๋ฃจํธ ์ต์ํ
- GC๋ ๋ฃจํธ ๋ชฉ๋ก์ ๋๋ฉด์ ํด์ ํ ๊ฐ์ฒด๋ฅผ ์ฐพ์๋ธ๋ค. ๋ฃจํธ ๋ชฉ๋ก์ด ์ค์ด๋ค๋ฉด GC๊ฐ ์ํ๋๋ ํ์๋ ์ค์ด๋ค๊ฒ ๋๋ฉฐ ์ฑ๋ฅ ํฅ์์ ์ ๋ฆฌํ๋ค.
C# ๊ณ ์ฑ๋ฅ ์๋ฒ - ๋ฉ๋ชจ๋ฆฌ ๋จํธํ
์ด์ ๋ท๋ท์ GC๋ ๊ฝค๋ ์ธ๋งํ๊ฒ ๋ฐ์ ํ์ฌ, ์ฌ๋งํ ๊ฒฝ์ฐ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ตณ์ด ์ ๊ฒฝ์ฐ์ง ์๊ณ ์ฝ๋ฉํ ์ ์๊ฒ ๋์์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด C++ ๋์ C#์ ์ ํํ๋ ํฐ ์ด์ ์ด๊ธฐ๋ ํ๋ค.
leafbird.github.io
.NET Framework: 1026. ๋ท๋ท 5์ ์ถ๊ฐ๋ POH (Pinned Object Heap)
.NET Framework: 1026. ๋ท๋ท 5์ ์ถ๊ฐ๋ POH (Pinned Object Heap) [๋งํฌ ๋ณต์ฌ], [๋งํฌ+์ ๋ชฉ ๋ณต์ฌ] ์กฐํ: 6289 ๊ธ์ด ์ฌ๋ ์ ์ฑํ (techsharer at outlook.com) ํํ์ด์ง ์ฒจ๋ถ ํ์ผ ๋ถ๋ชจ๊ธ ๋ณด์ด๊ธฐ/๊ฐ์ถ๊ธฐ (์ฐ๊ด๋ ๊ธ์ด 4๊ฐ
www.sysnet.pe.kr
[C#] ๊ฐ๋น์ง ์ปฌ๋ ํฐ
C#์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ ํต์ฌ์ธ Garbage Collector์ ๋ํด ์์๋ณด์.
velog.io
๊ฐ๋น์ง ์ปฌ๋ ์ , ์ปฌ๋ ํฐ(Garbage Collection)๋?
Garbage Collection, ์ค์ฌ์ ์ฝ์ด๋ก GC๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์์ด๋ก ๊ทธ๋๋ก ์ฝ์ด์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก, ์์คํ ์์ ๋์ด์ ์ฌ์ฉํ์ง ์๋ ๋์ ํ ๋น๋ ๋ฉ๋ก๋ฆฌ ๋ธ๋ญ
blog.metafor.kr
[Programming/C#] ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)
CLR์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(Automatic Memory Managment) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ค์ฌ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)์ด ์๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฐ๋ฆฌ๋ง๋ก ๋ฐ๊พธ๋ฉด "์ฐ๋ ๊ธฐ ์๊ฑฐ"๋ผ๋
nomad-programmer.tistory.com
C# GC์ ์ดํด์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
# GC (๊ฐ๋น์ง ์ปฌ๋ ํฐ - Garbage Collector) ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ Java๋ C#์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.(์ดํ GC) C#์ C/C++์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ณด๋ค ๋น ๋ฅด๋ค. C/C++์ฒ๋ผ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ฒ์ฌํ ํ
chipmunk-plump-plump.tistory.com
Internals of the POH - .NET Blog
As folks are aware we added a new kind of heap in .NET 5 called the POH (Pinned Object Heap). Since this is a user facing feature (and there aren't that many of those in GC) I've been meaning to write about it but didn't get around till now.
devblogs.microsoft.com
[C#] POH(Pinned Object Heap)์ด๋?
๊ณ ์ ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ๊ฐ๋ ์ ๋จผ์ ์ง๊ณ ๊ฐ๊ฒ ์ต๋๋ค. C#์์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋ฉ๋ชจ๋ฆฌ ์์ถ์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ...
blog.naver.com
[Programming/C#] ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)
CLR์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(Automatic Memory Managment) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ค์ฌ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)์ด ์๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฐ๋ฆฌ๋ง๋ก ๋ฐ๊พธ๋ฉด "์ฐ๋ ๊ธฐ ์๊ฑฐ"๋ผ๋
nomad-programmer.tistory.com