Middle
Pastāstiet par atkritumu savākšanas metodēm (Garbage Collector).
sobes.tech AI
Atbilde no AI
Atkritumu savCollection metodes:
- Reference Counting (Atsauces skaitīšana): Katram objektam ir skaitītājs, kas skaita atsauces uz šo objektu. Kad skaitītājs sasniedz nulli, objekts tiek uzskatīts par atkritumu un dzēsts.
- Priekšrocības: Vienkārši, neapstādinās galveno programmas darbību ilgstoši.
- Trūkumi: Nespēj risināt cikliskās atsauces; prasa papildu vietu katram objektam skaitītājs.
- Tracing Garbage Collectors (Trasējošie atkritumu savācēji): Sāk ar "koka" objektu kopu (piemēram, aktīvas mainīgās, izsaukumu steks) un rekursīvi pārbauda visus pieejamos objektus no šiem avotiem. Nepieejamie objekti tiek uzskatīti par atkritumiem.
- Galvenās stratēģijas:
- Mark and Sweep (Marķēšana un tīrīšana):
- Mark (Marķēšana): Pārlūko objektu grafu un marķē visus pieejamos objektus.
- Sweep (Tīrīšana): Otrā pāreja atmiņā, dzēšot ne-marķētos objektus.
- Trūkumi: Atmiņas fragmentācija.
- Mark and Compact (Marķēšana un kompakcija):
- Mark (Marķēšana): Kā Mark and Sweep.
- Compact (Kompakcija): Pārvieto dzīvos objektus, lai tie būtu secīgi, novēršot fragmentāciju.
- Trūkumi: Sarežģītāks, var prasīt programmas apturēšanu.
- Copying (Kopēšana): Atmiņa ir sadalīta divās daļās (pusē). Katras atkritumu savākšanas laikā dzīvie objekti tiek kopēti uz otru daļu, pēc tam vecā daļa tiek pilnībā iztīrīta.
- Priekšrocības: Bez fragmentācijas, ātra atmiņas piešķiršana pēc savākšanas.
- Trūkumi: Prasa divreiz vairāk atmiņas nekā aktīvi izmantotā.
- Mark and Sweep (Marķēšana un tīrīšana):
- Galvenās stratēģijas:
- Generation Garbage Collection (Ģenerācijas atkritumu savākšana): Pamatojas uz pieņēmumu, ka lielākā daļa objektu dzīvo īsu laiku. Atmiņa ir sadalīta pa paaudzēm (jauna, veca). Objekti tiek novietoti jaunajā paaudzē, izveidojot. Ja objekts "izdzīvo" vairākus savākšanas ciklus jaunajā paaudzē, tas tiek pārvietots vecajā. Atkritumu savākšana notiek biežāk jaunajā paaudzē.
- Priekšrocības: Efektīva, jo lielākā daļa darba tiek veikta jaunajā paaudzē ar mazāku datu apjomu.
- Trūkumi: Nepieciešams uzraudzīt saites no vecajām paaudzēm uz jaunajām (piemēram, izmantojot kartītes vai citus mehānismus).
Piemēri valodām un to GC:
- Python: Reference Counting (ar ciklisku savākšanu cikliskām saitēm).
- Java, C#: Generational, Mark and Sweep, Mark and Compact, Copying.
- Go: Konkurēt, ne-generatīvs Mark and Sweep ar optimizācijām.