Title: Linguaggi di Programmazione Secondo Semestre / 07 - Garbage Collector

Q: Tombstones, Lock e Keys. Wild pointer e dailng reference
A: Wild pointer, di solito per non avviene per la non inizializzazoine dei puntatori, (facilmente individuabilie attraverso un analisi statica)
Dangling quando il riferimento della destinazione non è valido. (più difficili da gestire)
Le seguenti tecniche hanno il vantaggio che il programma genera errore/termina in caso di comportamento non voluto. Non è fatto per garantire l'esecuzione, ma per garantire la coerenza della memoria.
## Tombstones
Ad ogni allocazione si una una parola aggiuntiva chiamata tombstone, che contiene l'indirizzo del vero dato puntato. (è come un puntatore aggiuntivo)
Una tombstone può essere utilizzata una volta, quindi il programma prende molto spazio, e anche hop.
Tiene sottocontrollo tutte le possibili duplicazioni del puntatore che puntano all stessa tombstone (il free di una tombstone fa in modo che tutti i puntatnori associati siano free)
## Locks and Keys
Diamo a tutti i puntatori una chiave, e a tutti gli oggetti sulla heap un lock, quando facciamo l'accesso di un puntatore il runtime controlla che il lock e key conincidano.
Essendo che la probabilità che ci siano collissioni di chiave è molto bassa, possiamo riutilizzare lo spazio deallocato semplicemente cambiando la chiave.
Il problema principale è che abbiamo il doppio di memoria occupata rispetto al tombstone.

Q: Garbage Collector
A: Garbage collector sposta dalla gestione manuale che deve fatta dallo sviluppatore a se.
Ci sono due scopi che comprandono:
- garbage detecion: rilevare se gli oggetti sono in uso
- garbage collection: rilasciare la memoria occupata dagli oggetti non utilizzati
il funzionamento del collection dipende direttamente dalla garbage detection.
## Reference Count
Ad ogni oggetto puntato, è associato un counter di riferimenti (non modificabile dal programma), che viene aumentato ogni assegnamento e diminuito ogni volta che perde una variabile puntatore.
Un problama è l'impossibilità digestire strutture ricorsive.
(possibile da fare in maniera runtime cioè appena il c'è l'ultimo puntatore viene deallocato)
## Mark and Sweep
Marco tutti gli oggetti raggiungibili dai riferimenti dello stack.
E poi tolgo dalla memoria tutti gli oggetti non marcati
Questo procedimento invece deve essere fatto fermando il programma e analizzarlo, quindi non è realtime. (Il criterio per quando avviene il mark può essere uno qualsiasi) (stop-the-world garbage collector)
Ha il vantaggio di semplicità nell'implementazione è minore occupazione di memoria, perde però la reattività del programma.
## Inversione dei puntatori
serve per fare la mark degli oggetti, il gb si tiene due puntatori, prev e current, e invertiamo i puntatori degli oggetti che esploriamo per avere una storia della memoria. per evitare loop fa il backtracking sui quelli già marcati, e ci serve anche per le strutture con più puntatori.
## Stop and Copy
Si tengono due locazioni di memoria uguale, una libera una occupata, Si incomicia a copiare ogni oggetto raggiungibilie in modo contiguo nell'altra metà.
l'aumento della quantià di memoria disponibile diminuscie la frequenza di incoazione dle gb.