Sobes.tech
Middle+

Aké vlastnosti má zberač odpadu v Dart?

sobes.tech AI

Odpoveď od AI

Zberač odpadu v jazyku Dart používa algoritmus generáciového zberu odpadu (Generational Garbage Collection).

Kľúčové vlastnosti:

  • Generácie (Generations): Objekty sa delia na dve generácie:
    • Mladá generácia (Young Generation): Tu sa vytvárajú nové objekty. Zber odpadu v tejto generácii je rýchlejší a častejší, pretože väčšina objektov zomiera krátko po vytvorení.
    • Staršia generácia (Old Generation): Objekty, ktoré "prežili" niekoľko cyklov zberu odpadu v mladej generácii, sa presúvajú sem. Zber odpadu v staršej generácii je zriedkavejší, ale trvá dlhšie.
  • Prežívajúce objekty (Survivors): Objekty v mladej generácii, na ktoré sa odkazujú iné objekty, sa považujú za "prežívajúce" a môžu byť presunuté do staršej generácie.
  • Fázy zberu:
    • Minor GC (Minor Garbage Collection): Rýchly zber, ktorý sa týka iba objektov v mladej generácii.
    • Major GC (Major Garbage Collection): Dlhší zber, ktorý kontroluje objekty v staršej generácii.
  • Výhody generáciového zberu:
    • Optimalizácia pre krátkodobé objekty: Väčšina odpadu sa rýchlo odstraňuje z mladej generácie.
    • Zníženie času prestojov: Časté, ale krátke prestoje pre zber mladej generácie sú menej nápadné ako zriedkavé, ale dlhé prestoje pre celú haldu.
  • Zberač odpadu Dart VM:
    • Používa hybridný prístup, ktorý kombinuje kopírovanie (copying collector) pre mladú generáciu a značenie a premiestnenie (mark-and-sweep/compact) pre staršiu generáciu.
    • Kopírujúci zberač v mladej generácii rýchlo presúva živé objekty do inej oblasti pamäte, efektívne uvoľňujúc aktuálnu.
    • Značenie a premiestnenie v staršej generácii nachádza živé objekty a následne ich presúva, aby sa odstránila fragmentácia pamäte.
    • Funguje nezávisle od vlákien používateľského rozhrania, minimalizujúc blokovanie.
// Príklad vytvárania objektov, ktoré budú patriť do mladej generácie
class MyClass {
  String name;
  MyClass(this.name);
}

void main() {
  var obj1 = MyClass("Object 1"); // Bude vytvorený v mladej generácii
  var obj2 = MyClass("Object 2"); // Bude vytvorený v mladej generácii

  // Ak objekty nebudú udržiavané odkazmi, môžu byť zbierané
  // počas nasledujúceho zberu mladej generácie.

  // Ak tieto objekty budú dlho žiť a na ne budú odkazy,
  // môžu byť presunuté do staršej generácie.
}