Quando un garbage collector compatta gli oggetti nell'heap, cambia i riferimenti sullo stack?

17

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 gli oggetti nell'heap, come vengono aggiornati i riferimenti a quegli oggetti nello stack? Posso pensare a due possibili soluzioni:

  1. Passare attraverso lo stack (ei riferimenti nell'heap) e aggiornare 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 loro rubrica con il tuo nuovo indirizzo.
  2. Fornire una sorta di tabella di consultazione. Sarebbe come lasciare un indirizzo di inoltro all'ufficio postale locale.

I garbage collector utilizzano prevalentemente uno di questi due metodi? Qualche altro metodo? Entrambi?

    
posta todorojo 07.03.2013 - 01:14
fonte

1 risposta

8

Non ho esperienza specifica su questo, ma la mia comprensione è che il primo metodo è generalmente usato.

Il garbage collector deve analizzare lo stack in ogni caso per trovare le cose nell'heap a cui ci si riferisce dallo stack. Una volta che decide di spostare qualcosa, deve comunque correggerne i riferimenti e non c'è motivo di distinguere tra heap e stack in quel punto.

L'approccio alla tabella di ricerca in linea di principio potrebbe funzionare. Tuttavia ciò renderebbe necessario che tutti gli accessi puntatori effettuino 2 passaggi. Questo sarebbe un enorme impatto sulle prestazioni nei normali tempi di esecuzione. In particolare per il caso d'uso di molti piccoli oggetti. (Che è un caso in cui i programmi GC di stato dell'arte normalmente battono il conteggio dei riferimenti.)

    
risposta data 07.03.2013 - 02:02
fonte

Leggi altre domande sui tag