Quando un Garbage Collector compatta oggetti nell'heap, cambia i riferimenti nello stack?


18

Sembra una domanda semplice, ma dopo molte letture sull'argomento, non ho ancora trovato una risposta definitiva (forse perché è così semplice).

La mia domanda è questa: quando un garbage collector compatta oggetti nell'heap, come vengono aggiornati i riferimenti a quegli oggetti nello stack? Mi vengono in mente due possibili soluzioni:

  1. Passa attraverso lo stack (e i riferimenti nell'heap) e aggiorna il riferimento in modo che punti alla nuova posizione dell'oggetto. In analogia con lo spostamento, sarebbe come inviare una lettera a chiunque abbia il tuo indirizzo e chiedere loro di aggiornare la propria rubrica con il tuo nuovo indirizzo.
  2. Fornisci una sorta di tabella di ricerca. Sarebbe come lasciare un indirizzo di spedizione all'ufficio postale locale.

I netturbini utilizzano principalmente uno di questi due metodi? Qualche altro metodo? Tutti e due?



@StevenBurnap mi corregga se sbaglio, ma credo che il thread a cui ti sei collegato non abbia avuto risposte definitive. Sembravano speculare anche su questa domanda esatta. Potrei aver letto male. Se fornissero una risposta alla domanda, se non ti dispiace, penso che sarebbe utile riassumere la risposta qui per i futuri utenti SE (e me stesso!)
todorojo

Il termine per la cosa di cui stai parlando è "spazzatura in movimento". Francamente non so quanto siano comunemente usati.
Gort il robot

Risposte:


9

Non ho competenze specifiche su questo, ma la mia comprensione è che il primo metodo è generalmente utilizzato.

Il garbage collector deve comunque analizzare lo stack per trovare le cose a cui l'heap fa riferimento dallo stack. Una volta che decide di spostare qualcosa, deve comunque correggere i riferimenti ad essa, e non c'è motivo di distinguere tra heap e stack in quel punto.

L'approccio della tabella di ricerca in linea di principio potrebbe funzionare. Tuttavia ciò renderebbe necessari tutti gli accessi al puntatore in 2 passaggi. Ciò avrebbe un enorme impatto sulle prestazioni sui normali tempi di esecuzione. Soprattutto per il caso d'uso di molti piccoli oggetti. (Questo è un caso in cui i programmi GC all'avanguardia di solito battono il conteggio dei riferimenti.)


3
Vorrei aggiungere che penso che i GC probabilmente provino a non spostare le cose sull'heap a meno che non debbano farlo. Nel mondo multiprocessore di oggi deve essere un incubo di sincronizzazione quando devono aggiornare tutti i riferimenti a qualcosa nell'heap mentre è in esecuzione un programma che utilizza tali riferimenti. La tabella di ricerca semplificherebbe questo, ma penso che sia l'eccezione piuttosto che la norma, quindi la maggior parte dei GC probabilmente deve bloccare alcuni riferimenti, spostare la memoria, quindi aggiornare i riferimenti. +1 domanda interessante, +1 buona risposta.
GlenPeterson

3
@GlenPeterson Molti GC non spostano effettivamente le cose nell'heap e non affrontano questo problema. Ma un GC compattante per definizione sposta gli oggetti in movimento nella deframmentazione della memoria.
btilly

@GlenPeterson è una buona osservazione del fatto che spostare le cose sull'heap è un enorme dolore di sincronizzazione, questo è spesso trascurato anche se la compattazione GC ha enormi effetti a catena su un processo in esecuzione a causa di ciò. È il principale motivo per cui alle persone viene detto di fare tutto il possibile per mantenere gli oggetti il ​​più breve possibile, per evitare grandi aggiornamenti dell'heap che inducono la compattazione a contenere un lungo mutex. L'ignoranza del modo in cui queste cose si comportano può portare a quella che viene amorevolmente definita GC Freakout Mode.
Jimmy Hoffa

2
Il Macintosh originale e il sistema operativo Palm utilizzavano entrambi un approccio di tabella di ricerca per la gestione della memoria. I puntatori nella tabella venivano definiti maniglie. Un GC trasferente deve sapere dove si trova assolutamente positivamente ogni riferimento a qualsiasi oggetto che si sta muovendo; l'utilizzo di una sola tabella per tali scopi semplifica notevolmente le cose.
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.