2015-05-21 13 views
5

In Android SDK 21 nel codice Object.java, ho trovato il termine "Puntatore Brooks". Ho letto il post here ma non ne ho una chiara visione. Nel post, è descritto come riferimento all'Oggetto stesso nell'heap. Ma a cosa serve?
Come sarà utile nella raccolta dei dati obsoleti e nell'evacuazione degli oggetti?Puntatore Brooks nella classe dell'oggetto

risposta

3

Il blog di Roman spiega come funziona la sua implementazione di GC.

Intro

Overview

Brooks Forwarding Pointers

È una nuova funzionalità nel Shenandoah GC, permette thread delle applicazioni di interagire con gli oggetti in mucchio mentre vengono spostati durante la compattazione (spostare gli oggetti di riferimento in una posizione migliore), eliminando la necessità di "fermare il mondo"

Prima di ciò, era necessario impedire l'accesso agli oggetti di riferimento mentre il GC li spostava, per garantire che nessuno potesse accedere all'oggetto finché non si trovasse nella sua nuova posizione. Se hai provato ad accedere all'oggetto, ma il GC lo ha già spostato, si verificheranno dei problemi. Questo è il motivo per cui abbiamo "stop-the-world" quando è il momento di GC (nessun thread è consentito accedere agli oggetti in heap per misure di sicurezza). Mentre gli oggetti si muovono, il grafico dell'oggetto è considerato incoerente, quindi è meglio impedire l'accesso ad esso.

Con questo nuovo sistema, un forwarding pointer (scorrere verso il basso per puntatore inoltro) viene messo al posto dell'oggetto di riferimento usato per essere, che fa riferimento nuova posizione dell'oggetto. Ora non dobbiamo preoccuparci che l'oggetto non sia lì se il GC dovesse spostarlo, dal momento che possiamo ancora fare riferimento al puntatore di inoltro. Ora possiamo accedere all'oggetto mentre il GC lo sposta intorno a, il che significa che non è più necessario impedire l'accesso durante la compattazione.

Il "puntatore forwarding" Mi sto riferendo a è Brooks Pointer

+0

è il puntatore di inoltro sempre aggiornato con il nuovo indirizzo dell'oggetto nel processo di muoversi? – Diffy

+0

@Diffy Quando si verifica l'evacuazione, gli oggetti vengono spostati una sola volta: da "from-regions" a "to-regions". I puntatori di inoltro vengono posizionati nello spazio per prendere il posto di un oggetto spostato nello spazio. Non è necessario aggiornare costantemente il puntatore di inoltro. È tutto citato nel suo blog :) –

Problemi correlati