[Go] GC์ ๊ตฌ์กฐ
Go๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ด๋ฑ๋ ๋ค์ดํฐ๋ธ ์ธ์ด์์๋ GC๊ฐ ๋ฌ๋ฆฐ ๊ฝค ํน์ดํ ์
์ง์ ์ธ์ด๋ค.
๊ทผ๋ฐ ์์ง Java ๊ฐ์ ๊ณ ์ฐธ๋ค์ ๋นํ๋ฉด GC ์์ฒด์ ์ฑ์๋๊ฐ ๋ฎ์ ์ํ์ด๊ธด ํ๋ค.
์ ์ด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ทน๋จ์ ์ผ๋ก ๋์ ๋ฉ์ธํ๋ ์์ ์ฐ์ด๊ธฐ๋ณด๋จ ์์ํ ๋ณด์กฐ๋๊ตฌ์ ๋ ๋ง์ด ์ฐ์ด๋๊ฒ ํ์ค์ด๋ค๋ณด๋, ๋ฌธ์ ๊ฐ ๋ ํ๊ธฐ๋ ํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋๋ ๊ฐ๋ณ๊ฒ ์ฐ๋ ์์ค์์๋ ํฐ ๋ฌธ์ ๊ฐ ์๊ณ , ๊ณ์ํด์ ๋ฐ์ ํ๊ณ ๋ ์๋ค.
์ ๋ฐ์ ์ธ Go GC์ ๊ตฌ์กฐ๋ 1.5 ๋ฒ์ ๋ถํฐ ์ด๋ ์ ๋ ์์ฑ๋์๊ณ , ๊ทธ ์ดํ๋ก๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ ๋ง ์ด๋ฃจ์ด์ง๊ณ ์๋ค.
Go๊ฐ ์ด๋ค ๋งค์ปค๋์ฆ์ผ๋ก GC๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ด๋ค ์ฅ์ ๊ณผ ํ๊ณ๊ฐ ์๋์ง ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.
์ด์ชฝ ์
๊ณ ์ ๋ฐฐ์ธ Java์๋ ๋น๊ตํด๋ณด๋ฉด ์ข์ ๊ฒ์ด๋ค.
https://m.blog.naver.com/sssang97/223575258532
๋ณธ ํฌ์คํธ์์๋ Java์ GC์ ๋น๊ตํ๋ฉด์ Go๋ง์ด ๊ฐ๊ณ ์๋ ํน์ง๊ณผ ์ฅ๋จ์ ์ ์ ๋ฆฌํด๋ณธ๋ค.
Basic: Mark and Sweep ์๊ณ ๋ฆฌ์ฆ
ํ๋ GC์ ๊ทผ๊ฐ์ด ๋ ๊ธฐ๋ฒ ์ค ํ๋๋ค.
1960๋
์ ๋ฆฌ์ต์ ์ฐฝ์์ ๋งค์นด์๊ฐ ๋ง๋ค์๋ค.
https://m.blog.naver.com/sssang97/221567636644
Java์์๋ ๋ช๋ช GC ๊ธฐ๋ฒ์ ๋งํฌ์ค ์ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก์ผ๋ ํด์ถ๋ ๋ชจ์์๊ณ , Go๋ ์ง๊ธ๋ ์ด๊ฑธ ์ด๋ค.
๋ฃจํธ๊ฐ์ฒด๋ค๋ถํฐ ํ๋ฐํด ๋บ ๋๋ฉด์ ์ฐธ์กฐ๋๊ณ ์๋์ง๋ฅผ ์ฒดํฌํ๊ณ , ์ฐธ์กฐ๋์ง ์์๊ฑธ ์น ์ง์๋ฒ๋ฆฐ๋ค๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค.
๊ตฌํํ๊ธฐ์๋ ํธ๋ฆฌํ์ง๋ง ๋จ์ ์ด ๋ง์์ ์๋ฐ๋ ์ด ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์ ๋ฒ๋ ธ๋ค.
๋งค GC ํ์๋ง๋ค ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํ์ค์บํ๋ฉด์ ์ฐ๊ณ , ๋ ํ์ค์บํ๋ฉด์ ์ง์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ปค์ง๋ฉด ๊ฐ๋น์ด ์ ์๋๋ค๋๊ฒ ๋จ์ ์ด๋ค.
๊ฒ๋ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ํํธํ๋ ์ฌํ๋ค. ๊ทธ๋ฅ ์ผ๋จ ์ง์ฐ๊ณ ๋ณด๋๊ฒ ์ต์ข ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ํํธํ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์กฐ๊ฐ๋ชจ์์ ๋ ์ถ๊ฐ๋ก ์ํํด์ผ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ํํธํ๊ฐ ๋์ ๋ ์๋ก ์ฐ์๋ ํฐ ๊ณต๊ฐ์ด ์์ด์ ธ์ ๋น ๊ณต๊ฐ์ ์ฐพ๊ธฐ๋ ํ๋ค๊ณ , ์ถ๊ฐ์ ์ธ ์ ๋ฆฌ์์ ์ด ํ์ํด์ง ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Now: Concurrent Mark and Sweep
Go๋ Mark and Sweep์ ๋ณํ์ธ Concurrent Mark and Sweep(CMS)์ ๊ธฐ๋ณธ GC ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฌ์ฉํ๋ค.
์ด๊ฑด ์ฌ์ค ์๋ฐ๊ฐ ์ง์์ ํ๊ธฐํ CMS์ ์ ๊ทผ๋ฒ์ด ๋น์ค๋ฌด๋ฆฌํ๋ค. ์ธ๋ถ ๊ตฌํ์์ ์ฐจ์ด๊ฐ ์๊ธฐ๋ ํ์ง๋ง ๋ง์ด๋ค.
GC๋ฅผ ์ํํ๋ ์ค๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ์ค๋ ๋๊ฐ ๊ฑฐ์ ๋์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค๊ณ ํด์ Concurrent๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
Now: tri-color Mark and Sweep
Go๋ ๋งํฌ์ค์ค์์ ์ฆ๋ถ์ ์ผ๋ก(incremental) ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฐ ๋ชฉ์ ์ผ๋ก ์ํด ์์ฉ๋๋ ์๋ฆฌ๊ฐ 3์ ๋งํฌ์ค์ค์์ด๋ค.
๋ง๋ฌผ์ ๋ค์ต์คํธ๋ผ๊ฐ 1978๋ ์ ๊ณ ์ํ๊ณ Go 1.5๋ถํฐ ๋์ ๋๋ค.
์ผ๋ฐ์ ์ธ ๋งํฌ์ค์ค์์ mark ๊ณผ์ ๊ณผ sweep ๊ณผ์ ์ ์ฒ๋ฆฌํ ๋ Stop The World๋ฅผ ๋๋ ค์ผ ํ๋ค.
ํ์ง๋ง Go CMS์์๋ ์ ์ง์๊ฐ์ ์ต์ํํ ์ฑ๋ก GC์ ์ ์ ์ค๋ ๋๊ฐ ๋์์ ์คํ๋๋ค.
๊ทผ๋ฐ ์ด๋ฌ๋ฉด GC๊ฐ ์คํ๋๋ ๋์ค์๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์๊ธด๋ค. ๋์ค์ ๋ผ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋น์ฐํ GC ๋์์ผ๋ก ์กํ์ง ์์ ๊ฒ์ด๊ณ , ๋์๊ฐ ๋ ์ ์๋ค.
์ด๊ฑธ ์ํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ก ์ด 3์(tri-color) ๋งํฌ์ค์ค์์ด๋ค.
๋จ์ํ ๋งํฌ์ค์ค์์ "marked=false"์ "marked=true" 2๊ฐ์ ์์๋ง ์กด์ฌํ์ง๋ง, GoGC๋ ํ๊ฐ์ง์ ์์์ ๋ ์ถ๊ฐํ๋ค.
ํฐ์(์ ๊ฑฐ๋์), ๊ฒ์์(์์กด), ํ์(?)์ด๋ค.
ํ์์ "์ค์บ๋์ง๋ ์์์ง๋ง ์ญ์ ํ ์๋ ์์"์ ๋ปํ๋ค.
https://blog.stackademic.com/basics-of-golang-gc-explained-tri-color-mark-and-sweep-and-stop-the-world-cc832f99164c
3์ CMS์์๋ ๋ค์๊ณผ ๊ฐ์ ์คํ ์ผ๋ก GC๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ๋ฃจํธ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ํ์์ผ๋ก ์น ํ๋ค.
- ํ์์ ๊ฒ์์์ผ๋ก ์น ํ๊ณ , ํฐ์์ ๊ฐ๋ฆฌํค๊ณ ์๋๊ฒ ์๋์ง ํ์ธํ๋ค.
- ๊ฐ๋ฆฌํค๊ณ ์๋ ๋์์ค ํฐ์์ด ๋ฐ๊ฒฌ๋๋ฉด ํ์์ผ๋ก ์น ํ๋ค.
- ํ์์ด ์ ๋ถ ์ฌ๋ผ์ง๋๊น์ง 2-3์ ๋ฐ๋ณต
- ํฐ์์ ์ ๋ถ ์ญ์ ํ๋ค.
GC๋ฅผ ์คํํ๋ ๋์ค์ ๋ผ์ด๋ ๊ฐ์ฒด๋ค๋ ์ผ๋จ ํ์ ๊ฐ์ฒด๋ก ํ ๋นํ๊ณ , ํ์์ด ์์ผ๋ฉด ๋ค์ GC ์ธ์ดํด์ ๋๋ ๊ฒ์ด๋ค.
๋์ค์ ํ์ ๊ฐ์ฒด๊ฐ ์๊ธฐ๋ฉด ์๊ธฐ๋๋๋ก ๋บ๋บ์ด ๋๋ ค์ ์ฒ๋ฆฌํ๋, ๊ฐ๊ฐ์ Stop the World ์๊ฐ์ ์งง์ง๋ง GC์ ์ฌ์ดํด ์์ฒด๋ ๋ ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ์๋ค. ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ์ข ์ง์ฐ๋ ์๋ ์๋ค.
footprint๋ฅผ ํฌ์ํ๋ ๋์ ํ๊ท ์ ์ธ ์ ์ง์๊ฐ(latency)์ ์ต์ํํ๋ ๊ตฌ์กฐ๋ค.
GC๋ก ์ธํ ์ง์ฐ์๊ฐ์ด ์ต๋ 10ms๋ผ๊ณ ์๋ํ๋ ๊ฒ๋, GC๊ฐ ์งง์์๊ฐ ์๋๋ผ ์ฐ๋์ฐ๋ ๋์ด์ ์ฒ๋ฆฌํด์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. GC ์๋ฃ์ ์์๋๋ ์๊ฐ ์์ฒด๋ ๊ธธ๋ค.
Diff: ์ธ๋๋ณ GC ์์
์ฌํ GC ์์คํ
๋ค์ ์ธ๋ ์ด๋ก ์ ์
๊ฐํด์ "ํ๋ฅ ์ ์ผ๋ก ๊ธ๋ฐฉ ์ญ์ ๋ ๊ฐ์ฒด๋ค์ด ๋ชจ์ฌ์๋" ์ ์ธ๋ ์์ญ๊ณผ "์ค๋ ์์กดํ ๊ฐ์ฒด๋ค์ด ๋ชจ์ฌ์๋" ๊ตฌ์ธ๋ ์์ญ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ ๋ค๋
๊ฐ ์ฆ๋ช
๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฅผ ํตํด์ ๋ฉ๋ชจ๋ฆฌ ํํธํ ๋ฌธ์ ์ GC ์ฑ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์์๋ค.
ํ์ง๋ง Go๋ ์ธ๋๋ณ ์ด๋ก ์ ๋์
ํ์ง ์๊ณ ์์ ๋ง์ ๊ธธ์ ๊ฑท๊ณ ์๋ค.
ํฅํ์๋ ์ด๋จ์ง ๋ชจ๋ฅด์ง๋ง, ์ง๊ธ์ ์๋ค.
Go ๊ฐ๋ฐ์ง๋ค๋ ๋ฃ์ง ์์๊ฑฐ๋ผ๋ ๋จ์ธ์ ํ์ง๋ ์๊ณ "์คํ์ด ํ์ํ" ๋ถ๋ถ์ด๋ผ๊ณ ์ ์ํ๊ณ ์๋ค.
์๋ง ์ผ๋จ์ GC ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ๊ณ ๊ฐ๋ณ๊ฒ ์ ์งํ๋ ค๋ ๋ชฉ์ ์ด ํฐ๊ฑฐ๊ฐ๋ค.
Go๋ ๋์ ์ธ๋๋ณ ์ด๋ก ์์ ๋์ค๋ "์๋ช
์ด ์งง์ ๊ฐ์ฒด"๋ฅผ ํ ๋์ ์คํ์ ํ ๋นํ๋ ๊ผผ์๋ก ์ฆ์ ํ ๋น&ํด์ ๋ก ์ธํ ๋ถํ๋ฅผ ๊ฐ์์ํจ๋ค. ์ด๊ฑธ escape analysis๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋์ Go์์๋ ๋์ ํ ๋น์ ํ๋๋ผ๋ ์คํ์ ํ ๋น๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๊ทผ๋ฐ ์ด๊ฒ ๋ชจ๋ ๊ฑธ ์ปค๋ฒํ๋๊ฑด ์๋๋ผ์ Java๋ณด๋ค ๋ค๋จ์ด์ง๋๊ฑด ๋ง๋ค. ํ ๋น ๊ด๋ จํด์๋ ๊ทธ๋ฅ ํจ์จ์ ์ธ ํํ๋ก ์ง๋ผ๊ณ ๊ถ์ ํ๋ฉด์ ์ฌ์ฉ์ ์ฑ ์์ผ๋ก ๋ ๋๊ธฐ๋ ๊ฒฝํฅ์ด ์๋ค.
Basic: Escape Analysis
๋์ ๊ฐ์ฒด ํ ๋น์ ์คํ ๊ธฐ๋ฐ์ ์ง์ญ๋ณ์๋ณด๋ค ์์กด์ฃผ๊ธฐ๊ฐ ์์ ๋กญ๋ค๋ ์ ์์ ์์ง ์์ ์ ์ก์๋ด๊ธฐ๊ฐ ๊น๋ค๋กญ๋ค.
ํ์ง๋ง ๋์ ํ ๋น๋ ์ฝ๋ ํจํด์ ๋ฐ๋ผ์๋ ํด์ ์์ ์ด ๋ช
ํํ๊ฒ ๋๋ฌ๋ ๋๊ฐ ์๋ค.
๊ทธ๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ ์ ๋ถ์์ผ๋ก ์ต์ ํํ๋๊ฑธ Escape ๋ถ์์ด๋ผ๊ณ ๋งํ๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ ๋์ ํ ๋น์ด ํฌํจ๋์ง๋ง
void Function() {
** var obj = new Something();**
** **** // ...******
** return**
}
obj๊ฐ ์ฌ์ค์ ์ ํจ์ ์ข ๋ฃ ์์ ์ ๋ ๋ผ๊ฐ๋ค๋๊ฒ ๋ช ํํ๋ค. ๋ฐ๋ผ์ Escape ๋์์ ๋ค์ด๊ฐ๊ณ , ๋์ ํ ๋น์ด ์๋ ์คํ ํ ๋น์ผ๋ก ์ต์ ํ๋๋ค.
๋ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋
Something Function() {
** var obj = new Something();**
** **** // ...******
** return obj**
}
๊ฐ์ฒด๊ฐ ํจ์ ํ๋ฆ ๋ฐ์ผ๋ก ์ ์ด๋๊ธฐ์ ๊ฐ์ฒด์ ์์กด์ฃผ๊ธฐ๋ฅผ ์์ธกํ ์ ์๋ค. ์ด๊ฑด ์ต์ ํํ ์ ์๋ค.
๊ทธ๋ฅ ํ์ ๋ค์ด๊ฐ๋ค.
์ฐธ๊ณ ๋ก ์ด๊ฑด Go์๋ง ์ฌ์ฉ๋๋๊ฑด ์๋๊ณ , Java ๊ฐ์ ๋ค๋ฅธ ์ธ์ด๋ค๋ ๊ณตํต์ ์ผ๋ก ์ฐ๋ ์ต์ ํ ๊ธฐ๋ฒ์ด๋ค.
Diff: ๋ฉ๋ชจ๋ฆฌ ์ปดํฉ์ ์์
GC๋ฅผ ํตํด ์ฐ๋ ๊ธฐ ๊ฐ์ฒด๋ฅผ ์ ์ ๋ฆฌํ๋๋ผ๋, ๊ณต๊ฐ์ด ๋ฌ์ฑ๋ฌ์ฑ ๋ ์ ๋๋๊ธฐ๊ฐ ๋๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ํํธํ๋ผ๊ณ ํ๋ค.
GoGC ์์ฒด๋ ๋ฉ๋ชจ๋ฆฌ ์ปดํฉ์
์ ๋ฐฐ์ ํ ์ฑ๋ก ๊ตฌํ๋์ด์๋ค.
๋์ allocator๋ฅผ ๊ฑด๋๋ฆฌ๋ ๊ฒ์ผ๋ก ์๋๋ฌ์ ๋ฌธ์ ๋ฅผ ํํผํ๋ค.
New: TCMalloc
Go๋ TCMalloc์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๋ฉ๋ชจ๋ฆฌ Pool ๊ธฐ๋ฐ allocator๋ฅผ ํตํด์ ๋ฉ๋ชจ๋ฆฌ ํํธํ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ํํ๋ค.
์ด๊ฑด ์ฌ์ค Go ์ ์ฉ allocator๋ ์๋๊ณ , C/C++์ฉ์ผ๋ก ๋ง๋ค์๋ ๋ฒ์ฉ์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ํํธํ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ฃผ์ฅ๋ ์๋๋ฐ, ๊ทธ๊ฑด ๊ณผ์ฅ์ด๊ณ ์๊ธฐ๋ ์๋ค. ์ด์ ๋ค์ด๊ฐ๋ณด๋ฉด ์ด๋ฐ์ ๋ฐ ๋ณผ๋ฉ์๋ฆฌ๊ฐ ๋ง๋ค.
TCMalloc์ ๋ด๋ถ์ ์ผ๋ก ๊ฝค ๋ณต์กํ ๋ ์ด์ด๋ฅผ ๊ฐ์ง๋ค.
https://google.github.io/tcmalloc/design.html
๋ฐฑ์๋, ๋ฏธ๋ค์๋, ํ๋ก ํธ์๋๋ค.
๋ฐฑ์๋๋ OS์์ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ค๊ณ , ๋ฏธ๋ค์๋๋ ํ ๋นํด์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ ๊ด๋ฆฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก ํธ์๋๋ ๋ชจ์๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ก๊ทธ๋จ์ ๋๋ ์ค๋ค.
ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ์น๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ 60๊ฐ์ง์ ํด๋์ค๋ก ๋งค์ฐ ์ธ๋ถํํด์ ๊ด๋ฆฌํ๋ค. ์ด๊ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํํธํ ๋ฌธ์ ๋ฅผ ์ค์ธ๋ค.
๋ฌธ์
๊ทผ๋ฐ ๋ฌธ์ ๋, tcmalloc์ด ํด๊ฒฐํ๋ค๊ณ ์ฃผ์ฅํ๋ ์ฅ์ ๋ค์ ๊ฒฐ๊ตญ ๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌ์ํด์ ์ป๋ ๊ฑฐ๋ ๊ฒ์ด๋ค.
tcmalloc์ด ๊ทธ๋ ๊ฒ ์์ฒญ๋๊ณ ์๋ฒฝํ๋ฉด ๋ค๋ฅธ ์ธ์ด๋ค๋ ๋ค allocator๋ฅผ tcmalloc์ผ๋ก ์ผ์ ๊ฒ์ด๋ค. ๋ค๋ฅธ ์ธ์ด ๊ฐ๋ฐ์๋ค์ด ๋ฐ๋ณด๋ผ์ ์์ผ๊ฒ ๋๊ฐ?
tcmalloc์ ํ ๋น ์ต์ ํ๋ฅผ ์ํด์ GC ๋ฐํ์์ฒ๋ผ ์ง์ ๋ฉ๋ชจ๋ฆฌ ํ์ ๊ฐ๊ณ ์ ๋์ํ๋ค. ๊ทธ ๋ง์ธ์ฆ, ํ ๋น์ ํด๋ ๋ฐ๋ก OS์ ๋ฐํ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
GoGC ์์ฒด์์๋ ๋ฉ๋ชจ๋ฆฌํ์ ๋ค๊ณ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ, ๋ฉ๋ชจ๋ฆฌํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋๋ tcmalloc ๋ด์์ ๋ฉ๋ชจ๋ฆฌํ์ ๋ ๋ค๊ณ ์์ผ๋ ์ฌ์ค์ Go๋ ๋ฉ๋ชจ๋ฆฌํ์ด 2๋จ๊ณ๋ก ์กด์ฌํ๋ ์
์ด๋ค.
๋ด๊ฐ ์๊ธฐ๋ก ๋ค๋ฅธ GC ์ธ์ด๋ค์ค์ ์ด๋ฐ๊ฑด ๋ฑํ ์๋ค.
๋น์ฐํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ๊ฒ์ผ๋ฅด๊ฒ ํด์ ๋๋ ๋ ์ค์ค ์๊ณ , GoGC์์ ์๋ฌด๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๋๋ผ๋ tcmalloc์์ OS์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด ๋ถ์ ๋ฌผ์ฒ๋ผ ๋จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ฒ๋ค๊ฐ ํต์์ ์ผ๋ก tcmalloc์ ๊ธฐ๋ณธ allocator์ ๋นํด ์ต๋ 2~3๋ฐฐ๊น์ง๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํญ์ํ ์ ์๋ค.
๊ทธ๋์ ์ค์ ๋ก๋ Go๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น/ํด์ ๊ฐ ๋น๋ฒํ ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ฉด ์ค์ ์ฌ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ๋ช๋ฐฐ๋ฅผ ๋๊ฒ๋ ์ฐ๋ ๊ธฐ๊ฐ ๋จ์์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ํ์์ด ๊ต์ฅํ ํํ๊ฒ ๋ฐ์ํ๋ค.
low-latency๋ผ๋ ๋ช
๋ชฉ ํ์ gc ์์ฒด๋ฅผ ๋งค์ฐ ๊ฒ์ผ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ 2๋จ๊ณ๋ผ ํ ๋นํด์ ๊ฐ ๋๋๊ฑฐ๊น์ง ํฉ์ณ์ ธ์ ์๊ธฐ๋ ๋ถํํ์์ด๋ค.
์ฌ์ค ์ด๊ฑด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ธฐ๋ณด๋จ ์ฑ ์์ ํํผํ ๊ฒ์ ๊ฐ๊น์๋ณด์ด๋ ๊ธฐ์ ๊ฒฐ์ ์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์๋ ฅ์ด ์ฌํ ์ฌ๋ก์์๋ ์์ง Go๊ฐ ๋ถ์ ์ ํ๋ค๊ณ ๋ณธ๋ค.
CPU ์ง์ฝ์ ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ์ถ์ฒํ ๋งํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์ง์ฝ์ ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ์ถ์ฒํ์ง ์๋๋ค.
์ฐธ์กฐ
https://engineering.linecorp.com/ko/blog/go-gc
https://stackoverflow.com/questions/43995901/why-golang-garbage-collector-not-implement-generational-and-compact-gc
https://velog.io/@hyeok3011/Golang-GC
https://go.dev/blog/ismmkeynote
https://google.github.io/tcmalloc/design.html
https://groups.google.com/g/golang-nuts/c/KJiyv2mV2pU
https://blog.stackademic.com/basics-of-golang-gc-explained-tri-color-mark-and-sweep-and-stop-the-world-cc832f99164c
https://www.google.com/search?q=escape+analysis&client=ms-android-samsung-ss&sourceid=chrome-mobile&ie=UTF-8
https://google.github.io/tcmalloc/overview.html
https://github.com/gperftools/gperftools/issues/756