Sobes.tech
Middle

C# da chiqindilarni yig'ish konseptsiyasi nima?

sobes.tech AI

AIdan javob

Chiqindilarni yig'uvchi (GC) avtomatik ravishda xotirani boshqaradi, uni dastur tomonidan endi ishlatilmaydigan ob'ektlardan ozod qiladi. U avtomatik rejimda ishlaydi, bu esa xotirani ajratish va bo'shatish bo'yicha qo'lda boshqaruvni yo'q qiladi, bu esa xotira oqibati va ko'rsatkichlar bilan bog'liq xatoliklar xavfini kamaytiradi.

Chiqindilarni yig'ish jarayoni quyidagi bosqichlarni o'z ichiga oladi:

  1. Belgilash (Marking): GC qaysi ob'ektlar hali ham foydalanilayotganligini aniqlaydi. Buning uchun, u asosiy ob'ektlar to'plamidan (masalan, global o'zgaruvchilar yoki joriy oqimlarning steklaridagi ob'ektlar) boshlanadi va ulardan kirish mumkin bo'lgan barcha ob'ektlarni belgilaydi.
  2. Kompaktsiya (Compacting): GC omon qolgan ob'ektlarni xotirada harakatlantiradi, yangi xotira uchun ketma-ket bloklarni bo'shatadi. Bu bosqichda shuningdek, harakatlangan ob'ektlarga ko'rsatkichlar yangilanadi.
  3. Tozalash (Sweeping): GC foydalanilmaydigan ob'ektlar tomonidan egallangan xotirani bo'shatadi.

.NET'dagi GC avlodlarga bo'lingan. Xotira avlodlarga bo'lingan:

  • Avlod 0 (Gen 0): Qisqa umrli ob'ektlarni o'z ichiga oladi. Bu avlodning yig'ishi ko'proq amalga oshiriladi.
  • Avlod 1 (Gen 1): Gen 0 yig'ishidan o'tgan ob'ektlar uchun buffer vazifasini bajaradi. U Gen 0 ga qaraganda kamroq yig'iladi.
  • Avlod 2 (Gen 2): Uzun umrli ob'ektlarni o'z ichiga oladi. U kamroq yig'iladi va yuqori ishlashni talab qiladi.

Ob'ektlar "yashash" holatiga qarab avlodlar orasida harakatlanadi.

Masalan, ob'ekt yaratish va foydalanish:

// Ob'ekt yaratish
MyObject obj = new MyObject();
// Ob'ektni ishlatish
obj.DoSomething();
// Ob'ekt endi ishlatilmaydi, GC uni yig'ishi mumkin
obj = null;

Majburiy chiqindilarni yig'ishni GC.Collect() yordamida chaqirish mumkin, ammo odatda tavsiya etilmaydi, chunki GC avtomatik ravishda yig'ish vaqtini optimallashtiradi.

// Majburiy chiqindilarni yig'ishni amalga oshirish (ko'p hollarda tavsiya etilmaydi)
GC.Collect();
GC.WaitForPendingFinalizers(); // Finalizatorlarning yakunlanishini kutish