2013-06-05 4 views
6

Quali algoritmi di garbage collection possono riconoscere gli oggetti inutili non appena diventano immondizia?Quali algoritmi di garbage collection "con precisione temporale" esistono?

L'unica cosa che mi viene in mente è il conteggio dei riferimenti con una ricerca del ciclo aggiunta ogni volta che un conteggio dei riferimenti viene decrementato a un valore diverso da zero.

Esistono altri interessanti algoritmi di raccolta che possono raggiungere questo obiettivo? (Nota che sto chiedendo solo per curiosità, sono consapevole che tutti questi collezionisti sarebbero probabilmente incredibilmente inefficienti)

+0

C'è stato un post oggi su Hacker News su GC in tempo reale. (Non l'ho letto) – leppie

+0

È possibile eseguire il GC mark-and-sweep dopo ogni modifica del riferimento. Anche se sarebbe estremamente inefficiente. – svick

+0

@svick: hai ragione. Ora mi sento stupido :) – Askaga

risposta

-4

Tale meccanismo si chiamerebbe "gestione dell'heap", non la garbage collection.

Per definizione, la garbage collection è disaccoppiata dalla gestione dell'heap. Questo perché in alcuni ambienti/applicazioni è più efficiente saltare un'operazione "gratuita" e tenere traccia di ciò che è in uso. Invece, ogni tanto, solo un attimo fa e raccolgo tutti i nodi non referenziati e li rimettono nella lista libera.

== == Addendum

mi viene downvoted per aver tentato di correggere la terminologia della gestione heap con garbage collection. Il Wikipedia article concorda con il mio utilizzo, e ciò che ho imparato all'università, anche se è stato diversi decenni fa. Linguaggi come Lisp e Snobol hanno inventato la necessità di garbage collection. Linguaggi come C non forniscono un ambiente di runtime così gravoso; invece si affidano al programmatore per gestire la pulizia dei bit di memoria e risorse inutilizzati.

+1

Mi sembra un commento terminologico per me, non in realtà una risposta alla domanda. – svick

+0

Anche io non penso che tu abbia ragione. Il conteggio dei riferimenti * è * una forma di garbage collection. – svick

+0

@wallyk: hai citato un articolo di Wikipedia (perché non collegarlo?). Ho guardato "gestione dell'heap" su wikipedia che reindirizza a "gestione della memoria" che si occupa principalmente di dettagli su os-level e tecniche di allocatore, che non è esattamente correlato alla mia domanda. Inoltre, come ha già commentato lo svick, il tuo post non ha veramente risposto alla mia domanda. La tua risposta spiega in pratica perché i collezionisti della vita reale non lavorano in una materia proposta nel mio op, un fatto di cui sono già a conoscenza come ho chiarito nella mia domanda. Comunque sentiti libero di modificare la tua risposta per rispondere effettivamente alla domanda e lo inviterò. – Askaga

0

Sebbene non sia un algoritmo di garbage collection, l'analisi di escape consente di ragionare sulla durata di vita degli oggetti. Quindi, se l'efficienza è una preoccupazione e gli oggetti dovrebbero essere raccolti non in tutti i casi, ma in casi "ovvi", può essere utile. L'idea di base è di eseguire l'analisi statica del programma (in fase di compilazione o di caricamento se compilato per una VM) e di capire se un oggetto appena creato può sfuggire a una routine in cui è stato creato (da qui il nome dell'analisi) . Se l'oggetto non viene passato da nessun'altra parte, non è archiviato nella memoria globale, non viene restituito dalla routine specificata, ecc., Può essere rilasciato prima di tornare da questa routine o anche prima, nel luogo in cui è stato utilizzato per l'ultima volta.

Gli oggetti che non durano più della chiamata al metodo associato possono essere allocati nello stack anziché nell'heap in modo che possano essere rimossi dal ciclo di garbage collection in fase di compilazione, riducendo quindi la pressione sul GC generale.