Sobes.tech
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):
        1. Segna (Mark): Attraversa il grafo degli oggetti, segnando tutti gli oggetti accessibili.
        2. Raccogli (Sweep): Secondo passaggio sulla memoria, elimina tutti gli oggetti non segnati.
        • Svantaggi: Frammentazione della memoria.
      • Segna e compatta (Mark and Compact):
        1. Segna (Mark): Come in Mark and Sweep.
        2. 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.
  • 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.