TIL-081 | Garbage Collection

Lee, ChankyuΒ·2022λ…„ 2μ›” 4일
0

Computer Science

λͺ©λ‘ 보기
8/12

🌈 Garbage Collection

🧐 μ§€λ‚œ TIL-080κΈ€μ—μ„œ 파이썬의 GILκ°œλ…μ„ κ³΅λΆ€ν•˜λ©° 파이썬의 가비지 μ»¬λ ‰μ…˜ 방식에 λŒ€ν•΄ 언급을 ν–ˆμ—ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” 가비지 μ»¬λ ‰μ…˜μ— λŒ€ν•΄ μ’€ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€.

가비지 μ»¬λ ‰μ…˜ (Garbage Collection,GC)λž€?

  • λ©”λͺ¨λ¦¬ 관리 기법 μ€‘μ˜ ν•˜λ‚˜λ‘œ, μ‹œμŠ€ν…œμ—μ„œ 더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 동적 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 블둝을 μ°Ύμ•„ μžλ™μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ν•œ μžμ›μœΌλ‘œ νšŒμˆ˜ν•˜λŠ” 것을 λœ»ν•œλ‹€.

  • 더 이상 ν•„μš”μ—†μ–΄μ§„ λ©”λͺ¨λ¦¬λ₯Ό μ“°λ ˆκΈ°(Garbage), μ‹œμŠ€ν…œμ—μ„œ 가비지 μ»¬λ ‰μ…˜μ„ μˆ˜ν–‰ν•˜λŠ” 뢀뢄을 가비지 컬렉터(Garbage Collector)라 λΆ€λ₯Έλ‹€.


λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λž€?

  • λ©”λͺ¨λ¦¬μ˜ νž™(Heap) μ˜μ—­μ— ν• λ‹Ήλœ 뢀뢄이 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ”λ°λ„ ν•΄μ œλ˜μ§€ μ•Šμ€ μ±„λ‘œ λ©”λͺ¨λ¦¬λ₯Ό 계속 μ μœ ν•˜κ³  μžˆλŠ” 것이닀.


가비지 μ»¬λ ‰ν„°μ˜ 원리

  • 가비지 μ»¬λ ‰μ…˜ μž‘μ—…μ„ ν•˜λŠ” 가비지 μ»¬λ ‰ν„°λŠ” μ•„λž˜μ™€ 같은 일을 ν•œλ‹€.

    • λ©”λͺ¨λ¦¬ ν• λ‹Ή
    • μ‚¬μš© 쀑인 λ©”λͺ¨λ¦¬ 인식
    • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 인식
  • ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λŠ” OS에 ν”„λ‘œκ·Έλž¨ 싀행에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μš”μ²­ν•˜κ²Œ λ˜λŠ”λ°, μ΄λ•Œ ν• λ‹Ήν•˜κ²Œ λ˜λŠ” λ©”λͺ¨λ¦¬ μ €μž₯ μ£Όμ†Œλ₯Ό offset μ£Όμ†ŒλΌκ³  ν•œλ‹€.

  • ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ“€μ€ ν”„λ‘œκ·Έλž¨μ΄ μž‘λ™ν•˜λ©΄ ν•„μ—°μ μœΌλ‘œ 가비지가 λ°œμƒν•˜κ²Œλœλ‹€.
    기쑴에 가리킀고 있던 λ©”λͺ¨λ¦¬κ°€ μƒˆλ‘­κ²Œ μ„ μ–Έ ν˜Ήμ€ ν˜•λ³€ν™˜μ΄ 되면, λ‹€λ₯Έ 곳을 κ°€λ¦¬ν‚€κ²Œ λ˜λ©΄μ„œ μ£Όμ†Œλ₯Ό μžƒμ–΄λ²„λ¦¬κ²Œ 되고 λ‹€μ‹œ 찾을 수 μ—†κ²Œ λ˜λ©΄μ„œ μ •λ¦¬λ˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬κ°€ 생겨버리기 λ•Œλ¬Έμ΄λ‹€.

  • μ΄λ•Œ 가비지 μ»¬λ ‰ν„°λŠ” 가비지λ₯Ό λ‹€λ₯Έ μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό μ‹œν‚¨λ‹€.


파이썬의 Garbage Collector

  • CPythonμ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λŠ” λ°©λ²•μ—λŠ” 크게 2가지가 μžˆλ‹€.
    1) Generational Garbage Collection(μ„ΈλŒ€λ³„ 가비지 μ»¬λ ‰μ…˜)
    2) Reference Counting (레퍼런슀 μΉ΄μš΄νŒ…)
    πŸ‘‰ μ΄μ€‘μ—μ„œ 레퍼런슀 μΉ΄μš΄νŒ… 방법을 주둜 μ‚¬μš©ν•œλ‹€. (μ§€λ‚œ TIL-080 글에도 μ„€λͺ…이 λ˜μ–΄ μžˆλ‹€.)

  • 레퍼런슀 μΉ΄μš΄νŒ…μ€, 객체λ₯Ό λ§Œλ“€λ•Œλ§ˆλ‹€ μ–Όλ§ˆλ‚˜ κ·Έ 객체가 μ‚¬μš©λ˜κ³  μžˆλŠ”μ§€ μΉ΄μš΄νŒ…ν•˜κ³  객체가 μ°Έμ‘°λ λ•Œλ§ˆλ‹€ μ¦κ°€λ˜κ³  μ°Έμ‘°κ°€ ν•΄μ œλ˜λ©΄ κ°μ†Œν•œλ‹€. 그리고 0이되면 λ©”λͺ¨λ¦¬ 할당을 릴리즈 ν•˜λŠ” 방법이닀.

  • sys 라이브러리의 getrefcount ν•¨μˆ˜λ‘œ 객체의 μ°Έμ‘° 횟수λ₯Ό μ•Œ 수 μžˆλ‹€.

import sys

text = 'λ°±μ—”λ“œ 개발자 CK!'
print(sys.getrefcount(text))

lst = [text]
print(sys.getrefcount(text))

tup = (text)
print(sys.getrefcount(text))

dic = {'text': text}
print(sys.getrefcount(text))

a = text
print(sys.getrefcount(text))

>>> 2
>>> 3
>>> 4
>>> 5
>>> 6

βœ” λ³€μˆ˜λ‘œ μ§€μ •λ˜λŠ” μˆœκ°„λΆ€ν„°κ°€ μ°Έμ‘° 횟수 1νšŒμ΄λ‹€.
βœ” 첫 print μž‘λ™ν•˜λ©° 1회 μΆ”κ°€
βœ” λ¦¬μŠ€νŠΈμ— 인용되며 1회 μΆ”κ°€
βœ” λ‘λ²ˆμ§Έ print λΆ€ν„°λŠ” 횟수 μΆ”κ°€ μ•ˆλ¨
βœ” tuple에 인용되며 1회 μΆ”κ°€
βœ” λ”•μ…”λ„ˆλ¦¬μ— 인용되며 1회 μΆ”κ°€
βœ” λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήλ˜λ©° 1회 μΆ”κ°€

πŸ™†β€β™‚οΈ 같은 κΈ°λŠ₯의 ν”„λ‘œκ·Έλž¨μ΄λ”λΌλ„ λ©”λͺ¨λ¦¬ 관리에 따라 μ„±λŠ₯이 κ·Ήλͺ…ν•˜κ²Œ λ‹€λ₯Ό 수 μžˆλ‹€. ν•œμ •λœ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 개발자의 λͺ«μ΄κΈ° λ•Œλ¬Έμ— 가비지 μ»¬λ ‰μ…˜κ³Ό 같은 κ°œλ…μ˜ λ™μž‘μ›λ¦¬, λ‚΄λΆ€ ꡬ쑰λ₯Ό μ’€ 더 ν™•μ‹€νžˆ 곡뢀할 ν•„μš”κ°€ μžˆλŠ” 것 κ°™λ‹€.


πŸ“ Reference

  1. https://ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)
  2. https://blog.metafor.kr/163
  3. https://beststar-1.tistory.com/15
  4. https://twinparadox.tistory.com/623
profile
Backend Developer - "Growth itself contains the germ of happiness"

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보