I garbage collector generazionali sono intrinsecamente compatibili con la cache?


38

Un tipico garbage collector generazionale mantiene i dati allocati di recente in un'area di memoria separata. Nei programmi tipici, molti dati hanno una vita breve, quindi la raccolta frequente di rifiuti giovani (un ciclo GC minore) e la raccolta di rifiuti obsoleti di rado è un buon compromesso tra sovraccarico di memoria e tempo impiegato a fare GC.

Intuitivamente, il vantaggio di un garbage collector generazionale rispetto a un collector a singola regione dovrebbe aumentare all'aumentare del rapporto di latenza della memoria principale rispetto alla cache, poiché i dati nella giovane regione sono spesso accessibili e conservati tutti in un unico posto. I risultati sperimentali confermano questa intuizione?


una meta discussione correlata sui tag appropriati per la domanda.
Kaveh,

Risposte:


19

Ecco alcuni articoli che parlano delle implicazioni della cache dei garbage collector generazionali:

Da quello che posso raccogliere, il problema principale è che i sistemi di immondizia raccolti scambiano spazio nella memoria per evitare la raccolta anticipata. Lo stesso vale per la memoria cache. Come hai suggerito, molto probabilmente le cose della prima generazione si troveranno nella cache, quindi la loro allocazione e raccolta saranno molto più veloci di qualcosa nella memoria principale, o paginate su disco. Il problema principale è la dimensione della prima generazione rispetto alla dimensione della cache. Se la cache si riempie prima della prima generazione, allora inizi a perdere quei benefici man mano che i fallimenti iniziano ad accumularsi.


10

C'è un aspetto molto complicato di tutti i raccoglitori di immondizia che potrebbe essere sorpreso in alcune descrizioni, e cioè la "scansione completa" o "raccolta completa". Periodicamente, a caso, a intermittenza devono scansionare tutti gli oggetti. i collezionisti generazionali sono migliori nel posticipare la scansione completa e nel ridurne al minimo la durata, ma è ancora necessario.

Il collezionista generazionale si concentrerà su quello che a volte viene chiamato spazio "nursery", ma alla fine / inevitabilmente dovrà raccogliere sullo spazio di generazione "più vecchio", causando una scansione completa della memoria.

Questa scansione completa è incompatibile con quasi tutti gli schemi di memorizzazione nella cache della memoria e (soprattutto!) Nel senso che quasi tutti gli schemi di memorizzazione nella cache / virtualizzazione falliranno / dovranno fallire gravemente in qualsiasi miglioramento delle prestazioni in questo caso.

Quindi la risposta chiave a questa domanda è la frequenza con cui viene attivata la scansione completa, e quanto "cattivo" è il suo effetto quando si verifica e se può essere tollerato. questo si riduce a una domanda / proprietà più dipendente dall'applicazione.

In altre parole per "la maggior parte" dell'operazione del raccoglitore, una cache probabilmente lo aiuterà (la cache e lo spazio "giovane" della scuola materna si sovrappongono generalmente!), Ma c'è un periodico, intermittente, eventuale, inevitabile, pesante, forse anche un picco "degradante" delle prestazioni quando lo spazio "vecchia generazione" è completamente raccolto e il "tasso di hit" della cache si ridurrà in pessimo dato che molti oggetti al di fuori di esso vengono tutti presi in un ciclo stretto dal pieno ciclo di scansione / raccolta. In altre parole, una discontinuità periodica inevitabile (in cui stime / medie / tendenze delle prestazioni ecc. Sono fuorvianti e inapplicabili).

Ciò che sta emergendo sono alcuni nuovi sistemi di raccolta progettati per integrarsi con i sistemi di gestione della memoria sottostanti (memorizzazione nella cache / virtualizzazione). sembra che gli approcci storici che disaccoppiano completamente i sistemi separati di raccolta della memoria, memorizzazione nella cache e virtualizzazione non funzioneranno così come gli approcci che combinano / integrano / affrontano tutti e tre gli aspetti insieme.

Vedi ad esempio cache garbage collection di Zhou e Demsky.


Così si potrebbe sostenere che GC generazionali sono di cache-friendly rispetto ai non-generazionali (classica) quelli?
Raffaello

Direi che il GC dovrebbe essere progettato in modo integrato con cache e memoria virtuale come parte del suo design, il che è complicato nelle architetture esistenti. tuttavia per espandere la risposta: sì, i collezionisti generazionali aggregano / consolodano / raggruppano gli oggetti utilizzati di frequente in memoria contigua che sarà intrinsecamente più compatibile con la cache rispetto ad altri progetti in cui gli oggetti utilizzati di frequente e raramente sono sparsi / mescolati (sebbene quest'ultimo avrà ancora qualche vantaggio in cache).
vzn

1
Un aspetto alquanto complicato della fusione tra GC e architetture di cache / virtualizzazione è che tali architetture in genere non si preoccupano del contenuto delle pagine di memoria, ma in un sistema GC sono richieste. Lingue diverse a volte promettono ai programmatori funzionalità correlate al GC diverse e può essere difficile capire quali funzioni supportare a livello di sistema operativo. L'approccio migliore probabilmente direbbe che ogni oggetto deve contenere un puntatore a una struttura i cui campi iniziali sono definiti dal sistema operativo, ma che possono essere seguiti da dati specifici della lingua che il sistema operativo non conoscerebbe o che non dovrebbero interessare.
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.