Middle
Rääkige prügi kogumise meetoditest (Garbage Collector).
sobes.tech AI
Vastus AI-lt
Meetodid prügikoristuseks:
- Reference Counting (Viidete arvutamine): Igal objektil on viidete loendur. Kui loendur jõuab nulli, loetakse objekt prügiks ja eemaldatakse.
- Eelised: Lihtne, ei blokeeri programmi tööd pikka aega.
- Miinused: Ei tegele tsükliliste viidetega; nõuab iga objekti jaoks täiendavat ruumi loenduri jaoks.
- Tracing Garbage Collectors (Jälitavad prügikoristajad): Alustavad "juur"-objektidest (näiteks aktiivsed muutujad, kutsesalk) ja läbivad rekursiivselt kõik juurtest kättesaadavad objektid. Kättesaamatud objektid peetakse prügiks.
- Peamised strateegiad:
- Mark and Sweep (Märgi ja pühkige):
- Mark (Märgi): Läbib objektide graafi ja märgib kõik kättesaadavad objektid.
- Sweep (Pühkige): Teine läbimine mälust, kustutades märkimata objektid.
- Miinused: Mälukahjustus.
- Mark and Compact (Märgi ja kompaktimine):
- Mark (Märgi): Nagu Mark and Sweep.
- Compact (Kompaktimine): Liigutab elavaid objekte, et need oleksid järjestikused, kõrvaldades fragmentatsiooni.
- Miinused: Keerulisem, võib nõuda programmi peatamist.
- Copying (Kopeerimine): Mäluaeg jaguneb kaheks alaks (poolruumid). Iga prügikoristuse korral kopeeritakse elavad objektid ühest alast teise. Seejärel puhastatakse vana ala täielikult.
- Eelised: Ei ole fragmentatsiooni, kiire mälu eraldamine pärast kogumist.
- Miinused: Vajab kaks korda rohkem mälu kui aktiivselt kasutatav.
- Mark and Sweep (Märgi ja pühkige):
- Peamised strateegiad:
- Generation Garbage Collection (Põlvkondlik prügikoristus): Põhineb oletusel, et enamik objekte elab lühikest aega. Mälu jaguneb põlvkondadeks (noor, vana). Objekte paigutatakse noore põlvkonna alla loomisel. Kui objekt "elab" mitu kogumist noores põlvkonnas, liigub ta vanasse. Kogumine toimub sagedamini noores põlvkonnas.
- Eelised: Tõhus, kuna enamik tööd tehakse noores põlvkonnas väikese andmemahtuga.
- Miinused: Vajab jälgimist vanade ja noorte põlvkondade vahel (näiteks kasutades kaarte või muid mehhanisme).
Näited keeltest ja nende GC:
- Python: Reference Counting (tsüklilise kogumisega tsüklilistele viidetele).
- Java, C#: Põlvkondlik, Mark and Sweep, Mark and Compact, Copying.
- Go: Paralleelne, mitte-põlvkondlik Mark and Sweep koos optimeerimistega.