Junior
რა არის garbage collector (მტვრის შეგროვებელი) C#-ში?
sobes.tech AI
პასუხი AI-სგან
C# შლაგბული — ეს არის .NET-ის სამუშაო გარემოს (CLR) ნაწილი, რომელიც ავტომატურად მართავს მეხსიერებას, გათავისუფლებით უფრო მიუწვდომელ ობიექტებს დაკავებულ რესურსებს.
მუშაობის პრინციპები:
- ობიექტების მონიტორინგი: შლაგბული აკონტროლებს მართვად ბეჭდურ მასივში შექმნილ ობიექტებს.
- მიწვდომადობის განსაზღვრა: იგი განსაზღვრავს, რომელ ობიექტებს აქვს მუშაობის კოდი (ანუ მათზე მოქმედი ბმულები).
- მიწვდომადობის გარეშე ობიექტების შეგროვება: ობიექტები, რომლებიც აღარ არის ხელმისაწვდომი, ითვლება "მტვერს" და შეიძლება უსაფრთხოდ წაიშალოს.
მტვერსასუფთავებელი პროცესში შედის:
- მარკირება (Marking). GC სკანირებს სტეკს და რეგისტრრებს, რათა იპოვოს ძირები (ძირითადი ობიექტები). ძირებიდან ის ირგვლივ ხატავს ობიექტების გრაფს, რომლებიც ხელმისაწვდომია.
- კონკატენაცია (Compacting). ეს საშუალებას აძლევს მეხსიერების ფრაგმენტაციას შემცირდეს. GC გადაადგილებს ხელმისაწვდომ ობიექტებს უწყვეტი მეხსიერების ბლოკში, დატოვებს თავისუფალ სივრცეს.
- გათავისუფლება (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() ავტომატურად გამოიძახება