Skip to content

Latest commit

ย 

History

History
68 lines (41 loc) ยท 6.54 KB

GC.md

File metadata and controls

68 lines (41 loc) ยท 6.54 KB
  • 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++์„ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

      gcmodule.c ์ฝ”๋“œ๋กœ ๋ณด๊ธฐ

    • GC์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด

      • ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด ์งˆ ๋•Œ ํŒŒ์ด์ฌ์€ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์™€ 0 ์„ธ๋Œ€์— ํ• ๋‹นํ•œ๋‹ค. ๋งŒ์•ฝ 0 ์„ธ๋Œ€์˜ ๊ฐ์ฒด ์ˆ˜๊ฐ€ threshold 0๋ณด๋‹ค ํฌ๋ฉด collect_generations()๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
      • collect_generations()์ด ํ˜ธ์ถœ๋˜๋ฉด ๋ชจ๋“  ์„ธ๋Œ€(๊ธฐ๋ณธ์ ์œผ๋กœ 3 ๊ฐœ์˜ ์„ธ๋Œ€)๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์„ธ๋Œ€(2 ์„ธ๋Œ€)๋ถ€ํ„ฐ ์—ญ์œผ๋กœ ํ™•์ธํ•œ๋‹ค. ํ•ด๋‹น ์„ธ๋Œ€์— ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ ํšŸ์ˆ˜๊ฐ€ ๊ฐ ์„ธ๋Œ€์— ๋Œ€์‘๋˜๋Š” threshold n๋ณด๋‹ค ํฌ๋ฉด collect()๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      • collect() ๋ฉ”์„œ๋“œ๋Š” ์ˆœํ™˜ ์ฐธ์กฐ ํƒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŠน์ • ์„ธ๋Œ€์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด(reachable)์™€ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด(unreachable)๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด ์ง‘ํ•ฉ์„ ์ฐพ๋Š”๋‹ค. ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ์ง‘ํ•ฉ์€ ๋‹ค์Œ ์ƒ์œ„ ์„ธ๋Œ€๋กœ ํ•ฉ์ณ์ง€๊ณ (0 ์„ธ๋Œ€์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉด 1 ์„ธ๋Œ€๋กœ ์ด๋™), ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด ์ง‘ํ•ฉ์€ ์ฝœ๋ฐฑ์„ ์ˆ˜ํ–‰ ํ•œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค.
    • ์–ด๋–ป๊ฒŒ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง€ํ•˜๋Š”๊ฐ€

      • ๋จผ์ € ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด(e.g. tuple, list, set, dict, class)์— ์˜ํ•ด์„œ๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ์•„์•ผํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ •์ˆ˜, ๋ฌธ์ž์—ด์€ ๋ฌด์‹œํ•œ์ฑ„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์•„์ด๋””์–ด๋กœ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋ฅผ ์ถ”์ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋งํฌ ํ•„๋“œ์— ๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ข‹๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์—†์ด๋„ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด ์ง‘ํ•ฉ์—์„œ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด ์ง‘ํ•ฉ์— ์ถ”๊ฐ€๋˜๊ณ  ์ œ๊ฑฐ๋  ๋•Œ ์ง‘ํ•ฉ์—์„œ ์‚ญ์ œ๋œ๋‹ค.
      • ์ด์ œ ๋ชจ๋“  ์ปจํ…Œ์ดํ„ฐ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
        1. ๊ฐ์ฒด์— gc_refs ํ•„๋“œ๋ฅผ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ์™€ ๊ฐ™๊ฒŒ ์„ค์ •ํ•œ๋‹ค.
        2. ๊ฐ ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ , ์ฐธ์กฐ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ gc_refs๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
        3. gc_refs๊ฐ€ 0 ์ด๋ฉด ๊ทธ ๊ฐ์ฒด๋Š” ์ปจํ…Œ์ด๋„ˆ ์ง‘ํ•ฉ ๋‚ด๋ถ€์—์„œ ์ž๊ธฐ๋“ค๋ผ๋ฆฌ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
        4. ๊ทธ ๊ฐ์ฒด๋ฅผ unreachable ํ•˜๋‹ค๊ณ  ํ‘œ์‹œํ•œ ๋’ค ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•œ๋‹ค.
      • ์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ˆœํ™˜ ์ฐธ์กฐ ๊ฐ์ฒด๋ฅผ ํƒ์ง€ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๋Š”์ง€ ์•Œ์•˜๋‹ค.