Sobes.tech
Junior

რა არის garbage collector (მტვრის შეგროვებელი) C#-ში?

sobes.tech AI

პასუხი AI-სგან

C# შლაგბული — ეს არის .NET-ის სამუშაო გარემოს (CLR) ნაწილი, რომელიც ავტომატურად მართავს მეხსიერებას, გათავისუფლებით უფრო მიუწვდომელ ობიექტებს დაკავებულ რესურსებს.

მუშაობის პრინციპები:

  • ობიექტების მონიტორინგი: შლაგბული აკონტროლებს მართვად ბეჭდურ მასივში შექმნილ ობიექტებს.
  • მიწვდომადობის განსაზღვრა: იგი განსაზღვრავს, რომელ ობიექტებს აქვს მუშაობის კოდი (ანუ მათზე მოქმედი ბმულები).
  • მიწვდომადობის გარეშე ობიექტების შეგროვება: ობიექტები, რომლებიც აღარ არის ხელმისაწვდომი, ითვლება "მტვერს" და შეიძლება უსაფრთხოდ წაიშალოს.

მტვერსასუფთავებელი პროცესში შედის:

  1. მარკირება (Marking). GC სკანირებს სტეკს და რეგისტრრებს, რათა იპოვოს ძირები (ძირითადი ობიექტები). ძირებიდან ის ირგვლივ ხატავს ობიექტების გრაფს, რომლებიც ხელმისაწვდომია.
  2. კონკატენაცია (Compacting). ეს საშუალებას აძლევს მეხსიერების ფრაგმენტაციას შემცირდეს. GC გადაადგილებს ხელმისაწვდომ ობიექტებს უწყვეტი მეხსიერების ბლოკში, დატოვებს თავისუფალ სივრცეს.
  3. გათავისუფლება (Sweeping). მიუწვდომელი ობიექტები (მარკირებული არაა) წაიშლება და მათი მეხსიერება გათავისუფლდება.

ძირითადი მახასიათებლები:

  • ავტომატური მართვა: ამცირებს დეველოპერის პასუხისმგებლობას მეხსიერების გათავისუფლებაზე.
  • პროგრეგაციები (Generations): ბეჭდური მასივი ნაწილდება პროგრეგაციებში (Gen 0, Gen 1, Gen 2). ეს ოპტიმიზირებს შეგროვებას, რადგან უმეტესობა ობიექტების სწრაფად ხდება მტვერი. ახალი ობიექტები შეიქმნება Gen 0-ში. თუ ობიექტი გადარჩება Gen 0-ის შეგროვების შემდეგ, ის გადადის Gen 1-ში და ასე შემდეგ.
  • ფინალიზატორები და განთავსება (Finalizers and Disposal): GC არ გარანტირებს IDisposable-ს განახორციელების ფინალიზატორების მყისიერ შესრულებას. არასამართლებრივი რესურსების გასათავისუფლებლად საჭიროა გამოიყენოთ გამიჯნული მეთოდი (Dispose(), using ბრძანება).
// მაგალითი `using` ბრძანების გამოყენებით რესურსების მყისიერ გასათავისუფლებლად
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // ფაილთან მუშაობა
} // stream.Dispose() ავტომატურად გამოიძახება