Quali sono gli algoritmi dietro GC a bassa pausa?

12

Alcune lingue, ad esempio java, hanno introdotto un GC di bassa pausa.

Quelli GC possono fare la maggior parte del lavoro senza mettere in pausa il mondo intero. Questo è ovviamente un problema abbastanza difficile perché richiede di analizzare la memoria quando il thread lo sta modificando, risultando in dati che possono essere utilizzati all'inizio del processo e non più quando finisce, o dati che sembrano essere garbages ma perché il il riferimento è stato spostato in memoria e non è mai apparso dove il GC stava guardando.

Quindi, in fondo, qual è l'algoritmo (i) dietro a questo?

I documenti di ricerca o il collegamento di un articolo veramente tecnico sarebbero considerati una risposta valida, poiché questo argomento è davvero tecnico.

    
posta deadalnix 23.08.2011 - 12:31
fonte

4 risposte

16

So basically, what is the algorithm(s) behind that?

È fondamentalmente un algoritmo di mark e sweep che "just" viene eseguito contemporaneamente in un thread separato.

Per quanto riguarda i documenti di ricerca su questo argomento:

risposta data 23.08.2011 - 12:35
fonte
4

Per quanto ho capito, il garbage collector di Java G1 utilizza le cosiddette zone heap per evitare di mettere in pausa l'intero mondo. Il modo in cui lo vedo è che mentre una delle regioni è bloccata da GC che esegue la pulizia, l'allocazione della memoria viene eseguita in un'altra regione.

Ecco una spiegazione di Jeremy Manson :

The principle is simple: the collector splits the heap up into fixed-size regions and tracks the live data in those regions. It keeps a set of pointers — the "remembered set" — into and out of the region. When a GC is deemed necessary, it collects the regions with less live data first (hence, "garbage first"). Often, this can mean collecting an entire region in one step: if the number of pointers into a region is zero, then it doesn't need to do a mark or sweep of that region...

risposta data 23.08.2011 - 17:15
fonte
4

La JVM in tempo reale di IBM utilizza un garbage collector chiamato Metronome che divide l'attività del GC in quanti discreti e li intercala con l'elaborazione dell'applicazione. Quindi, in pratica, anziché le pause periodiche (e non deterministiche) del GC stop-the-world, l'applicazione viene eseguita leggermente più lentamente mentre il GC viene eseguito in parallelo.

C'è un altro GC che esegue la deframmentazione dinamica e soddisfa i requisiti hard-realtime, ma l'unico riferimento che riesco a trovare è qui (è richiesta l'iscrizione a ACM).

Un interessante garbage collector simultaneo in tempo reale è senza pause . Utilizza l'approccio tradizionale di mark-and-sweep, ma è progettato per l'uso su sistemi multiprocessore e supporta il multithreading simultaneo senza blocco.

    
risposta data 23.08.2011 - 18:17
fonte
2

Il motivo per cui funziona è perché in Java, solo il GC può liberare memoria che potrebbe contenere riferimenti GC. Ciò significa che finché puoi leggere gli oggetti in un thread separato in modo sicuro, devi solo mettere in pausa il programma per osservare i riferimenti sullo stack.

Suggerirei per la mutazione di implementare una qualche forma di copia su scrittura per informare il GC sulla modifica.

    
risposta data 23.08.2011 - 12:44
fonte

Leggi altre domande sui tag