Гарбаге Цоллецтион ин Питхон је аутоматски процес који управља алокацијом меморије и њеном ослобађањем обезбеђујући ефикасно коришћење меморије. За разлику од језика као нпр Ц или Ц++ где програмер мора ручно да додели и ослободи меморију Питхон аутоматски управља меморијом кроз две примарне стратегије:
- Бројање референци
- Сакупљање смећа
Бројање референци
Питхон користи бројање референци за управљање меморијом. Сваки објекат води евиденцију о томе колико референци указује на њега. Када број референци падне на нулу, тј. нема референци, Питхон аутоматски ослобађа објекат. Пример:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Излаз
2 3 2
Објашњење:
- к на почетку се референцира двапут (једном са к једном од гетрефцоунт()).
- Додељивање и = к повећава број.
- Подешавање и = Ниједан уклања једну референцу.
Проблем са бројањем референци
Бројање референци не успева у присуству цикличних референци, тј. објеката који реферирају један на другог у циклусу. Чак и ако ништа друго не указује на њих, њихов број референци никада не достиже нулу. Пример:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Излаз
3 3
Објашњење:
- к садржи и и и садржи к .
- Чак и након брисања к и и Питхон неће моћи да ослободи меморију само помоћу бројања референци јер свака и даље упућује на другу.
Сакупљање смећа за цикличне референце
Сакупљање смећа је техника управљања меморијом која се користи у програмским језицима за аутоматско враћање меморије којој апликација више није доступна или је не користи. За руковање таквим кружним референцама Питхон користи а Гарбаге Цоллецтор (ГЦ) из уграђеног гц модула. Овај колектор је у стању да открије и очисти објекте укључене у референтне циклусе.
Генератионал Гарбаге Цоллецтион
Питхонов Генератионал Гарбаге Цоллецтор је дизајниран да се бави цикличним референцама. Он организује објекте у три генерације на основу њиховог животног века:
- Генерација 0: Новостворени објекти.
- Генерација 1: Објекти који су преживели један циклус прикупљања.
- Генерација 2: дуговечни објекти.
Када дође до референтних циклуса, сакупљач смећа их аутоматски открива и чисти ослобађајући меморију.
Аутоматско скупљање отпада у циклусима
Сакупљање смећа се покреће аутоматски када број алокација премаши број делокација за одређени праг. Овај праг се може проверити помоћу гц модула.
Pythonimport gc print(gc.get_threshold())
Излаз
(2000 10 10)
Објашњење: Враћа скуп прагова за генерације 0 1 и 2. Када алокације пређу граничну вредност, колекција се покреће.
Ручно сакупљање смећа
Понекад је корисно ручно позвати сакупљач смећа, посебно у случају референтних циклуса. Пример:
Pythonimport gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c)
Излаз
0 10
Објашњење:
- деф фун(и) ствара цикличну референцу тако што сам прави референцу на речник.
- гц.цоллецт() покреће сакупљање смећа и чува број сакупљених објеката (у почетку 0).
- за ја у опсегу (10) позива забава (и) 10 пута креирање 10 цикличних референци.
- гц.цоллецт() поново покреће сакупљање смећа и штампа број сакупљених циклуса.
Врсте ручног сакупљања смећа
- Одлагање смећа засновано на времену: Сакупљач смећа се покреће у фиксним временским интервалима.
- Сакупљање смећа засновано на догађајима: Сакупљач смећа се позива као одговор на специфичне догађаје као што је када корисник изађе из апликације или када апликација постане неактивна.
Принудно одвоз смећа
Питхон-ов сакупљач смећа (ГЦ) ради аутоматски да очисти неискоришћене објекте. Да бисте га присилили ручно, користите гц.цоллецт() из гц модула. Пример:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Објашњење:
- од а б ц брише референце на а б и ц чинећи их квалификованим за одлагање смећа.
- гц.цоллецт() присиљава прикупљање смећа да ослободи меморију чишћењем нереференцираних објеката.
Онемогућавање сакупљања смећа
У Питхон-у сакупљач смећа се покреће аутоматски да очисти нереференциране објекте. Да бисте спречили његово покретање, можете га онемогућити помоћу гц.дисабле() из гц модула. Пример:
Pythonimport gc gc.disable() gc.enable()
Објашњење:
- гц.дисабле() онемогућава аутоматско сакупљање смећа.
- гц.енабле() поново омогућава аутоматско сакупљање смећа.
Интеракција са питхон сакупљачем смећа
Уграђени механизам назван Питхон сакупљач смећа аутоматски елиминише објекте који више нису референцирани како би се ослободила меморија и зауставило цурење меморије. Питхон гц модул нуди бројне начине за интеракцију са сакупљачем смећа који се често извршава аутоматски.
1. Омогућавање и онемогућавање сакупљача смећа: Можете омогућити или онемогућити сакупљач смећа користећи гц. омогућити() и гц. дисабле() функције респективно. Пример :
басх дужина низаPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Присилно одвоз смећа: Можете ручно да покренете сакупљање смећа користећи гц. прикупити() функција. Ово може бити корисно у случајевима када желите да наметнете тренутно сакупљање смећа уместо да чекате да дође до аутоматског сакупљања смећа. Пример:
Pythonimport gc gc.collect()
3. Провера подешавања сакупљача смећа: Можете да проверите тренутна подешавања сакупљача смећа користећи гц.гет_тхресхолд() функција која враћа тупле који представља тренутне прагове за генерације 0 1 и 2. Пример:
Pythonimport gc t = gc.get_threshold() print(t)
Излаз
(2000 10 10)
4. Постављање прагова сакупљача смећа: Можете подесити прагове за сакупљање смећа користећи гц.сет_тхресхолд() функција. Ово вам омогућава да ручно подесите прагове за различите генерације што може утицати на учесталост сакупљања смећа. Пример:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Излаз
(500 5 5)
Предности и недостаци
Хајде да истражимо неке од предности и недостатака Питхоновог сакупљања смећа.
Предности | Недостаци |
|---|---|
Аутоматско управљање меморијом | Може увести додатне трошкове |
Нема ручног руковања меморијом | Захтева разумевање концепата памћења |
Ефикасно чишћење кроз генерације | Ограничена контрола времена ГЦ-а |
Прилагодљива подешавања ГЦ-а | Могућност грешака или цурења меморије |