Middle
Parlami dei metodi di raccolta dei rifiuti (Garbage Collector).
sobes.tech AI
Risposta dell'AI
Metodi di raccolta dei rifiuti:
- Conteggio dei riferimenti (Reference Counting): Ogni oggetto tiene un contatore di riferimenti a sé stesso. Quando il contatore raggiunge zero, l'oggetto è considerato rifiuto e viene eliminato.
- Vantaggi: Semplice, non blocca a lungo l'esecuzione principale.
- Svantaggi: Non gestisce riferimenti ciclici; richiede spazio aggiuntivo per il contatore in ogni oggetto.
- Raccoglitori di rifiuti di tracciamento (Tracing Garbage Collectors): Iniziano con un insieme di oggetti "radice" (ad esempio, variabili attive, stack di chiamate) e attraversano ricorsivamente tutti gli oggetti accessibili da queste radici. Gli oggetti inaccessibili sono considerati rifiuti.
- Strategie principali di tracciamento:
- Segna e raccogli (Mark and Sweep):
- Segna (Mark): Attraversa il grafo degli oggetti, segnando tutti gli oggetti accessibili.
- Raccogli (Sweep): Secondo passaggio sulla memoria, elimina tutti gli oggetti non segnati.
- Svantaggi: Frammentazione della memoria.
- Segna e compatta (Mark and Compact):
- Segna (Mark): Come in Mark and Sweep.
- Compatta (Compact): Sposta gli oggetti vivi in modo che siano contigui, eliminando la frammentazione.
- Svantaggi: Più complesso, può richiedere di fermare l'esecuzione del programma.
- Copia (Copying): Divide la memoria in due aree (semi-spazi). In ogni ciclo di raccolta, gli oggetti vivi di un'area vengono copiati nell'altra. Poi, l'area vecchia viene completamente pulita.
- Vantaggi: Nessuna frammentazione, allocazione rapida di memoria dopo la raccolta.
- Svantaggi: Richiede il doppio della memoria rispetto a quella attualmente usata.
- Segna e raccogli (Mark and Sweep):
- Strategie principali di tracciamento:
- Raccolta generazionale (Generational Garbage Collection): Basata sull'ipotesi che la maggior parte degli oggetti non vive a lungo. La memoria è divisa in generazioni (giovane, vecchia). Gli oggetti vengono inseriti nella generazione giovane alla creazione. Se un oggetto sopravvive a più raccolte nella generazione giovane, viene spostato in quella vecchia. La raccolta avviene più frequentemente nella generazione giovane.
- Vantaggi: Efficiente, poiché la maggior parte del lavoro si svolge nella generazione giovane con pochi dati.
- Svantaggi: Richiede il monitoraggio dei riferimenti dalle generazioni vecchie a quelle giovani (schede di registrazione o altri meccanismi).
Esempi di linguaggi e loro GC:
- Python: Conteggio dei riferimenti (con raccolta ciclica per riferimenti ciclici).
- Java, C#: Generazionale, Mark and Sweep, Mark and Compact, Copying (diverse varianti e combinazioni a seconda della versione e delle impostazioni JVM/.NET).
- Go: Concorrente, non generazionale, Mark and Sweep con ottimizzazioni.