I write about Backend, Infrastructure, Math, ML/AI, and Computer Science.
Building: @voicelabio
Contact: ask@otabek.io
Post #259
860
Garbage Collection
Garbage collector odatda xotirani toza saqlash uchun kerak. U xuddi bir xizmatkorga o'xshaydi. Agar xonangizda keraksiz va ishlatilmaydigan narsalarni ko'rsangiz uni axlatga olib chiqib tashlaysiz. Xuddi shu ishni dasturlash tillarida Garbage Collectorlar bajaradi.
Hop Garbage collector qachon va qanday keraksiz object yoki data ni aniqlaydi?
Bu ishni amalga oshirish uchun inson qanday yo'l tutsa dastur ham deyarli o'shanday ish qiladi. Ya'ni reference count xisoblanadi. Inson biror narsani kim va necha marta ishlatishini ko'rib aniqlasa, dastur reference count xisoblaydi. Reference bu biror objectga yo'naltirilgan pointer ya'ni ko'rsatgich yo'l deb atasak bo'ladi.
Reference Count qanday ko'payadi yoki kamayadi?
Bilamizki biror o'zgaruvchi ochganimizda biz unga qiymat saqlamaymiz, balkim o'zgaruvchilar shunchaki bizni o'sha qiymatga kirishimiz uchun ko'rsatgich vazifasini o'taydi.
Bu huddi mahallada har bir nuqtaga odam qo'yib yashinmachoq o'ynashdek gap. Ya'ni qo'ygan odamlariz kim-qayerga ketganini ko'rsatib turadi va siz ko'p vaqt sarflamasdan ularni tez topishingiz mumkin (O(1) vaqtda desa ham bo'ladi 😅). O'zgaruvchilar ham shu vazifani bajaradi.
Qachon bir nechta o'zgaruvchi bitta object yoki dataga reference bo'lsa u yerda reference count oshadi. Agar ular keyin boshqa objectga reference qilinsa yoki o'chirib tashlansa, RC tushadi.
Misol uchun:
a = "hello" # "hello" objecti yaratildi va a unga reference bo'ldi
b = a # Ref. Count 1taga oshdi.
del a # Ref. Count 1taga tushdi
b = 17 # Ref. count 1taga kamaydi
Yuqoridagi misol Python dasturlash tiliga tegishli va u yerda reference count qachon oshishi va qachon tushishi ko'rsatilgan.
Kelin buni real ko'rish uchun mana bunday ish qilamiz. sys modulini getrefcount() funksiyasi bizga objectimiz nechta referencega egaligini ko'rishimiz mumkin. __del__() dunder methodi orqali esa object o'chirilganini ko'rishimiz mumkin, del statement objectni o'chirish uchun ishlatiladi.
@otabekswe
Garbage collector odatda xotirani toza saqlash uchun kerak. U xuddi bir xizmatkorga o'xshaydi. Agar xonangizda keraksiz va ishlatilmaydigan narsalarni ko'rsangiz uni axlatga olib chiqib tashlaysiz. Xuddi shu ishni dasturlash tillarida Garbage Collectorlar bajaradi.
Hop Garbage collector qachon va qanday keraksiz object yoki data ni aniqlaydi?
Bu ishni amalga oshirish uchun inson qanday yo'l tutsa dastur ham deyarli o'shanday ish qiladi. Ya'ni reference count xisoblanadi. Inson biror narsani kim va necha marta ishlatishini ko'rib aniqlasa, dastur reference count xisoblaydi. Reference bu biror objectga yo'naltirilgan pointer ya'ni ko'rsatgich yo'l deb atasak bo'ladi.
Reference Count qanday ko'payadi yoki kamayadi?
Bilamizki biror o'zgaruvchi ochganimizda biz unga qiymat saqlamaymiz, balkim o'zgaruvchilar shunchaki bizni o'sha qiymatga kirishimiz uchun ko'rsatgich vazifasini o'taydi.
Bu huddi mahallada har bir nuqtaga odam qo'yib yashinmachoq o'ynashdek gap. Ya'ni qo'ygan odamlariz kim-qayerga ketganini ko'rsatib turadi va siz ko'p vaqt sarflamasdan ularni tez topishingiz mumkin (O(1) vaqtda desa ham bo'ladi 😅). O'zgaruvchilar ham shu vazifani bajaradi.
Qachon bir nechta o'zgaruvchi bitta object yoki dataga reference bo'lsa u yerda reference count oshadi. Agar ular keyin boshqa objectga reference qilinsa yoki o'chirib tashlansa, RC tushadi.
Misol uchun:
a = "hello" # "hello" objecti yaratildi va a unga reference bo'ldi
b = a # Ref. Count 1taga oshdi.
del a # Ref. Count 1taga tushdi
b = 17 # Ref. count 1taga kamaydi
Yuqoridagi misol Python dasturlash tiliga tegishli va u yerda reference count qachon oshishi va qachon tushishi ko'rsatilgan.
Kelin buni real ko'rish uchun mana bunday ish qilamiz. sys modulini getrefcount() funksiyasi bizga objectimiz nechta referencega egaligini ko'rishimiz mumkin. __del__() dunder methodi orqali esa object o'chirilganini ko'rishimiz mumkin, del statement objectni o'chirish uchun ishlatiladi.
import sys
class MyClass:
def __init__(self):
print("Creating object")
def __del__(self):
print("Deleting object")
obj = MyClass()
print("Reference count:", sys.getrefcount(obj) - 1)
# Reference Coutni oshiramiz
obj2 = obj
print("Reference count:", sys.getrefcount(obj) - 1)
# obj2 referenceni o'chiramiz
del obj2
print("Reference count:", sys.getrefcount(obj) - 1)
# obj ni o'chiramiz
del obj
Umid qilaman qisqacha Garbage collection mavzusiga tushunib oldingiz deb. Keyingi postda chuqurroq yoritishga harakt qilaman. Xatolar bo'lsa oldindan uzur.@otabekswe







