Junior
Python-дағы қоқыс жинағыш (garbage collector) деген не?
sobes.tech AI
AI-дан жауап
Python-дағы қоқыс жинағыш — бұл автоматты түрде жадты басқару механизмі, ол енді сілтемелері жоқ немесе тек циклдік сілтемелерде қатысатын объектілердің жадын босатады.
Python екі негізгі қоқыс жинау механизмін пайдаланады:
-
Сілтеме санын есептеу (Reference Counting):
- Әрбір объектінің сілтеме саны бар, ол оған сілтейтін айнымалылар немесе басқа объектілер санын көрсетеді.
- Егер объектінің сілтеме саны нөлге тең болса, ол қоқыс деп саналады және оның жадын дереу босатады.
- Бұл қарапайым және тиімді әдіс, бірақ ол циклдік сілтемелер мәселесін шешпейді.
-
Циклдік сілтемелерді анықтау (Generational Cyclic Garbage Collector):
- Сілтеме санын есептеуге қосымша жұмыс істейді.
- Өзара сілтеме жасайтын, бірақ сыртқы сілтемелері жоқ объектілер топтарын анықтайды.
- Маркировка-жою алгоритмін пайдаланады және бірнеше "ұрпақтар" бойынша жұмыс істейді, бұл оңтайландыру үшін. Жаңа объектілер жас ұрпақта орналасады, және қоқыс жинау жиі жүргізіледі.
# Сілтеме санын есептеу мысалы
a = [] # [] үшін сілтеме саны = 1
b = a # [] үшін сілтеме саны = 2
c = b # [] үшін сілтеме саны = 3
del a # [] үшін сілтеме саны = 2
del b # [] үшін сілтеме саны = 1
del c # [] үшін сілтеме саны = 0, жад босатылады
# Циклдік сілтеме мысалы
class Node:
def __init__(self, value):
self.value = value
self.next = None
self.prev = None
a = Node(1)
b = Node(2)
a.next = b
b.prev = a
# Мұнда a және b бір-біріне сілтеме жасайды
del a
del b
# a және b үшін сілтеме саны 1-ге тең болады, өзара сілтемелердің арқасында.
# Объектілер әлі де жадта, дегенмен a және b айнымалылары жойылды.
# Циклдік сілтемелерді жинағыш оларды анықтап, босатады.
Қоқыс жинағыш gc модулі арқылы басқарылады. Оны баптауға немесе өшіруге болады, дегенмен әдетте бұл ұсынылмайды.
import gc
# Қоқыс жинағыштың қосулы екенін тексеру
print(gc.isenabled())
# Қоқыс жинағышты қосу/өшіру
# gc.disable()
# gc.enable()
# Қоқыс жинағышты қолмен іске қосу
# gc.collect()