Sobes.tech
Middle

რა არის კონცეფცია ნაგვის შეგროვებაში C#-ში?

sobes.tech AI

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

გაყრის აგროვება (GC) ავტომატურად მართავს მეხსიერებას, გაათავისუფლებს მას იმ ობიექტებიდან, რომლებიც აღარ გამოიყენება პროგრამის მიერ. იგი მუშაობს ავტომატურად, ამოიღებს ხელით მეხსიერების განაწილებისა და გათავისუფლების საჭიროებას, რაც ამცირებს მეხსიერების ლიკების და მაჩვენებლების დაკავშირებულ შეცდომებს.

გაყრის პროცესში შედის შემდეგი ეტაპები:

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

.NET-ში GC გენერაციულია. მეხსიერება ნაწილდება სერედნებით:

  • სერია 0 (Gen 0): შეიცავს მოკლევადიანი ობიექტებს. ამ სერიის გროვა ყველაზე ხშირად ხდება.
  • სერია 1 (Gen 1): ბუფერია იმ ობიექტებისთვის, რომლებიც გადარჩნენ სერია 0 გროვას. იშვიათად იკრიბება, ვიდრე სერია 0.
  • სერია 2 (Gen 2): შეიცავს ხანგრძლივობის ობიექტებს. იშვიათად იკრიბება და მოითხოვს მეტ შესრულების უნარს.

ობიექტები გადადიან სერედნებს "ცოცხლობის" მიხედვით გროვების დროს.

მაგალითად, ობიექტის შექმნა და გამოყენება:

// ობიექტის შექმნა
MyObject obj = new MyObject();
// ობიექტის გამოყენება
obj.DoSomething();
// ობიექტი აღარ გამოიყენება, GC შეიძლება ის გროვდეს
obj = null;

მოწოდება მყისიერი გროვის შეგროვებისთვის GC.Collect()-ის გამოყენებით შესაძლებელია, მაგრამ ჩვეულებრივ არ არის რეკომენდებული, რადგან GC ავტომატურად ოპტიმიზირებს გროვების დროს:

// მყისიერი გროვის შეგროვება (მრავალ შემთხვევებში არ არის რეკომენდებული)
GC.Collect();
GC.WaitForPendingFinalizers(); // ფინალიზატორების დასრულების მოლოდინი