Middle
რა გესმის Dart-ის ნაგვის შეგროვების შესახებ?
sobes.tech AI
პასუხი AI-სგან
Dart იყენებს ერთთრაქტიან მტვრის შეგროვებელს, რომელიც დაფუძნებულია თაობის შეგროვებაზე (generational garbage collection).
ძირითადი მახასიათებლები:
- თაობის შეგროვება: ობიექტები იყოფა ორ თაობად:
- ახალი თაობა: ახალი, მოკლევადიანი ობიექტები. ხშირად იკრიბება.
- ძველი თაობა: ხანგრძლივი სიცოცხლის ობიექტები, რომლებიც გადაურჩნენ რამდენიმე შეგროვებას ახალგაზრდა თაობაში. იკრიბება იშვიათად.
- შეჩერება-დამთავრება-დამთავრება: მტვრის შეგროვების შესრულებისთვის საჭიროა პროგრამის (Dart იზოლატების) შეჩერება. თუმცა, ერთთრაქტიანობის და ოპტიმიზაციების გამო, შეფერხებები მინიმალურია.
- მარკ-და-გადაფურცვლა: ძველ თაობაში გამოიყენება მარკ-და-გადაფურცვლის ალგორითმი. პირველ რიგში მონიშნულია მისაღწევი ობიექტები, შემდეგ კი ამოიღება მიუწვდომელი. ახალგაზრდა თაობისთვის გამოიყენება კოპირების კოლექტორის ალგორითმი, რომელიც სწრაფად გადაადგილებს ცოცხალ ობიექტებს სხვა მეხსიერების სივრცეში.
- ციკლების არარსებობა: დეველოპერს არ სჭირდება მეხსიერების მართვა ან GC-ის გამოძახება ხელით. სისტემა ამას ავტომატურად ახორციელებს.
- ოპტიმიზაციები: მოიცავს ფუნქციების ინლაინინგს, ტიპების სპეციალიზაციას და ობიექტების გამოყოფას სტეკში, რაც ამცირებს მტვრის შეგროვებლის დატვირთვას.
მაგალითად, ახალი ობიექტის შექმნისას:
// ახალი ობიექტის შექმნა "ახალ" მეხსიერების თაობაში
var myObject = MyClass();
თუ myObject ხანგრძლივად რჩება მეხსიერებაში და ხელმისაწვდომია, ის დროთა განმავლობაში გადაიყვანება "ძველ" თაობაში. თუ ის აღარ იქნება მისაწვდომი, მტვრის შეგროვებელი მას ადრე თუ გვიან გაათავისუფლებს.
// myObject ახლა მიუწვდომელია, შეიძლება გაწმინდოს მტვრის შეგროვებელმა
myObject = null;
მნიშვნელოვანია აღინიშნოს, რომ Dart-ის მტვრის შეგროვებელი ეფექტურია, მაგრამ არ არის სამკურნალო მეხსიერების გაჟონვისგან, რომელიც შეიძლება წარმოიშვას ძლიერი კავშირების შენახვით ობიექტებზე, რომლებიც აღარ არის საჭირო (მაგალითად, გამოწერილობები, რომლებიც არ გაუქმებულა).