-
GC ์๋ ๋ฐฉ์
ํ์ด์ฌ์
๊ฐ๋น์ง ์ปฌ๋ ์
๊ณผ๋ ํผ๋ฐ์ค ์นด์ดํ
์ ํตํด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.-
๋ ํผ๋ฐ์ค ์นด์ดํ : ์ฐธ์กฐํ์๊ฐ 0์ด ๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ ๋ฐฉ์
-
๊ฐ๋น์ง ์ปฌ๋ ์ : ๋ ํผ๋ฐ์ค ์นด์ดํ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ(์ฐธ์กฐํ์๊ฐ 0์ ์๋์ง๋ง ๋๋ฌํ ์ ์๋ ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ์ํฉ) ์ฌ์ฉ
-
๋ํผ๋ฐ์ค ์นด์ดํ
๋ชจ๋ ๊ฐ์ฒด๋ ์ฐธ์กฐ๋นํ ๋ ๋ ํผ๋ฐ์ค ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๊ณ ์ฐธ์กฐ๊ฐ ์์ด์ง ๋ ์นด์ดํฐ๋ฅผ ๊ฐ์์ํจ๋ค. ์ด ์นด์ดํฐ๊ฐ 0 ์ด ๋๋ฉด ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ค. ์ด๋ค ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด
sys.getrefcount()
๋ก ํ์ธํ ์ ์๋ค. -
์ํ์ฐธ์กฐ
์๊ธฐ์์ ์ ์ฐธ์กฐํ๊ฑฐ๋ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ์ด์ ํด๋นํ๋ค. ์ด๋ค์ ์ฐธ์กฐํ์๋ 1์ด์ง๋ง, ์ด๊ฒ๋ค์ ์ญ์ ํด๋ฒ๋ฆฌ๋ฉด ์ ๊ทผ์ด ๋ถ๊ฐํ๋ค. ํ์ง๋ง ์ฐธ์กฐํ์๊ฐ 0์ด ์๋๋, ๋ ํผ๋ฐ์ค ์นด์ดํ ์ผ๋ก๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ๋ถ๊ฐํ ๊ฒ.
-
๊ฐ๋น์ง ์ปฌ๋ ํฐ
ํ์ด์ฌ์
gc
๋ชจ๋์ ํตํด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ง์ ์ ์ดํ ์ ์๋ค.gc
๋ชจ๋์ cyclic garbage collection ์ ์ง์ํ๋๋ฐ ์ด๋ฅผ ํตํด reference cycles(์ํ ์ฐธ์กฐ)๋ฅผ ํด๊ฒฐํ ์ ์๋ค. gc ๋ชจ๋์ ์ค๋ก์ง ์ํ ์ฐธ์กฐ๋ฅผ ํ์งํ๊ณ ํด๊ฒฐํ๊ธฐ์ํด ์กด์ฌํ๋ค.[gc
ํ์ด์ฌ ๊ณต์๋ฌธ์](https://docs.python.org/3/library/gc.html)์์๋ ์ํ ์ฐธ์กฐ๋ฅผ ๋ง๋ค์ง ์๋๋ค๊ณ ํ์ ํ ์ ์์ผ๋ฉดgc.disable()
์ ํตํด garbage collector ๋ฅผ ๋นํ์ฑํ ์์ผ๋ ๋๋ค๊ณ ์ธ๊ธํ๊ณ ์๋ค. -
GC ์๋ ๋ฐฉ์
-
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ด๋ถ์ ์ผ๋ก
generation
(์ธ๋)๊ณผthreshold
(์๊ณ๊ฐ)๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ฃผ๊ธฐ์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค. -
์ธ๋๋ 0,1,2 ์ธ๋๋ก ๊ตฌ๋ถ๋๊ณ , ์ต๊ทผ์ ์์ฑ๋ ๊ฐ์ฒด๋ 0, ์ค๋๋ ๊ฐ์ฒด์ผ์๋ก 2์ธ๋์ ์กด์ฌํ๋ค. ํ๋์ ๊ฐ์ฒด๋ ๋จ ํ๋์ ์ธ๋์๋ง ์กด์ฌํ๋ค.
-
์ธ๋๊ฐ ์์์๋ก ๋ ์์ฃผ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ๋๋ก ์ค๊ณ๋์ด ์๋ค. ์ด๋
generational hypothesis
์ ๊ทผ๊ฑฐํ๋ค.
- ๋๋ถ๋ถ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ๋๋ฌํ ์ ์๋ ์ํ๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
-
-
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๋ ์ฃผ๊ธฐ
์ฃผ๊ธฐ๋ threshold ์ ๊ด๋ จ์๋๋ฐ
gc.get_threshold()
๋ก ํ์ธํด ๋ณผ ์ ์๋ค.>>> gc.get_threshold() (700, 10, 10)
๊ฐ๊ฐ
threshold 0
,threshold 1
,threshold 2
์ ์๋ฏธํ๋๋ฐ n ์ธ๋์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ ํ์๊ฐthreshold n
์ ์ด๊ณผํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ํ๋๋ฉฐ ์ด ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์๋ค.0 ์ธ๋์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋ ํ์์์ ํด์ ๋ ํ์๋ฅผ ๋บ ๊ฐ, ์ฆ ๊ฐ์ฒด ์๊ฐ
threshold 0
์ ์ด๊ณผํ๋ฉด ์คํ๋๋ค. ๋ค๋ง ๊ทธ ์ดํ ์ธ๋๋ถํฐ๋ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ 0 ์ธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ผ์ด๋ ํ 0 ์ธ๋ ๊ฐ์ฒด๋ฅผ 1 ์ธ๋๋ก ์ด๋์ํจ ํ ์นด์ดํฐ๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค. ์ด 1 ์ธ๋ ์นด์ดํฐ๊ฐthreshold 1
์ ์ด๊ณผํ๋ฉด ๊ทธ ๋ 1 ์ธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ผ์ด๋๋ค. ๋ฌํํ๊ฒ ๋งํ์๋ฉด 0 ์ธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๊ฐ์ฒด ์์ฑ 700 ๋ฒ๋ง์ ์ผ์ด๋๋ค๋ฉด 1 ์ธ๋๋ 7000 ๋ฒ๋ง์, 2 ์ธ๋๋ 7 ๋ง๋ฒ๋ง์ ์ผ์ด๋๋ค๋ ๋ป์ด๋ค.์ด๋ฅผ ๋ง๋ก ํ์ด์ ์ค๋ช ํ๋ ค๋ ์กฐ๊ธ ๋ณต์กํด์ก์ง๋ง ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์
generation[0].count++
, ํด์ ์generation[0].count--
๊ฐ ๋ฐ์ํ๊ณ ,generation[0].count > threshold[0]
์ด๋ฉดgenreation[0].count = 0
,generation[1].count++
์ด ๋ฐ์ํ๊ณgeneration[1].count > 10
์ผ ๋ 0 ์ธ๋, 1 ์ธ๋ count ๋ฅผ 0 ์ผ๋ก ๋ง๋ค๊ณgeneration[2].count++
์ ํ๋ค๋ ๋ป์ด๋ค. -
GC์ ๋ผ์ดํ ์ฌ์ดํด
- ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด ์ง ๋ ํ์ด์ฌ์ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ 0 ์ธ๋์ ํ ๋นํ๋ค. ๋ง์ฝ 0 ์ธ๋์ ๊ฐ์ฒด ์๊ฐ
threshold 0
๋ณด๋ค ํฌ๋ฉดcollect_generations()
๋ฅผ ์คํํ๋ค. collect_generations()
์ด ํธ์ถ๋๋ฉด ๋ชจ๋ ์ธ๋(๊ธฐ๋ณธ์ ์ผ๋ก 3 ๊ฐ์ ์ธ๋)๋ฅผ ๊ฒ์ฌํ๋๋ฐ ๊ฐ์ฅ ์ค๋๋ ์ธ๋(2 ์ธ๋)๋ถํฐ ์ญ์ผ๋ก ํ์ธํ๋ค. ํด๋น ์ธ๋์ ๊ฐ์ฒด๊ฐ ํ ๋น๋ ํ์๊ฐ ๊ฐ ์ธ๋์ ๋์๋๋threshold n
๋ณด๋ค ํฌ๋ฉดcollect()
๋ฅผ ํธ์ถํด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๋ค.collect()
๋ฉ์๋๋ ์ํ ์ฐธ์กฐ ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๊ณ ํน์ ์ธ๋์์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด(reachable)์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด(unreachable)๋ฅผ ๊ตฌ๋ถํ๊ณ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด ์งํฉ์ ์ฐพ๋๋ค. ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด ์งํฉ์ ๋ค์ ์์ ์ธ๋๋ก ํฉ์ณ์ง๊ณ (0 ์ธ๋์์ ์ํ๋์์ผ๋ฉด 1 ์ธ๋๋ก ์ด๋), ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด ์งํฉ์ ์ฝ๋ฐฑ์ ์ํ ํ ํ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ค.
- ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด ์ง ๋ ํ์ด์ฌ์ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ 0 ์ธ๋์ ํ ๋นํ๋ค. ๋ง์ฝ 0 ์ธ๋์ ๊ฐ์ฒด ์๊ฐ
-
์ด๋ป๊ฒ ์ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์งํ๋๊ฐ
- ๋จผ์ ์ํ ์ฐธ์กฐ๋ ์ปจํ
์ด๋ ๊ฐ์ฒด(e.g.
tuple
,list
,set
,dict
,class
)์ ์ํด์๋ง ๋ฐ์ํ ์ ์์์ ์์์ผํ๋ค. ์ปจํ ์ด๋ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์, ๋ฌธ์์ด์ ๋ฌด์ํ์ฑ ๊ด์ฌ์ฌ๋ฅผ ์ปจํ ์ด๋ ๊ฐ์ฒด์๋ง ์ง์คํ ์ ์๋ค. - ์ํ ์ฐธ์กฐ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ด๋์ด๋ก ๋ชจ๋ ์ปจํ ์ด๋ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋ค. ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ๊ฐ์ฒด ๋ด๋ถ์ ๋งํฌ ํ๋์ ๋๋ธ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ข๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ด๋ ์ปจํ ์ด๋ ๊ฐ์ฒด ์งํฉ์์ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ์ ์๋ค. ์ปจํ ์ด๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์ด ์งํฉ์ ์ถ๊ฐ๋๊ณ ์ ๊ฑฐ๋ ๋ ์งํฉ์์ ์ญ์ ๋๋ค.
- ์ด์ ๋ชจ๋ ์ปจํ
์ดํฐ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ผ๋ ์ํ ์ฐธ์กฐ๋ฅผ ์ฐพ์ ์ ์์ด์ผ ํ๋ค. ์ํ ์ฐธ์กฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ์ฒด์
gc_refs
ํ๋๋ฅผ ๋ ํผ๋ฐ์ค ์นด์ดํธ์ ๊ฐ๊ฒ ์ค์ ํ๋ค. - ๊ฐ ๊ฐ์ฒด์์ ์ฐธ์กฐํ๊ณ ์๋ ๋ค๋ฅธ ์ปจํ
์ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ , ์ฐธ์กฐ๋๋ ์ปจํ
์ด๋์
gc_refs
๋ฅผ ๊ฐ์์ํจ๋ค. gc_refs
๊ฐ 0 ์ด๋ฉด ๊ทธ ๊ฐ์ฒด๋ ์ปจํ ์ด๋ ์งํฉ ๋ด๋ถ์์ ์๊ธฐ๋ค๋ผ๋ฆฌ ์ฐธ์กฐํ๊ณ ์๋ค๋ ๋ป์ด๋ค.- ๊ทธ ๊ฐ์ฒด๋ฅผ unreachable ํ๋ค๊ณ ํ์ํ ๋ค ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ค.
- ๊ฐ์ฒด์
- ์ด์ ์ฐ๋ฆฌ๋ ๊ฐ๋น์ง ์ฝ๋ ํฐ๊ฐ ์ด๋ป๊ฒ ์ํ ์ฐธ์กฐ ๊ฐ์ฒด๋ฅผ ํ์งํ๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋์ง ์์๋ค.
- ๋จผ์ ์ํ ์ฐธ์กฐ๋ ์ปจํ
์ด๋ ๊ฐ์ฒด(e.g.
-