2012-12-09 9 views
5

Ho scritto un'implementazione rapida e sporca di un elenco doppiamente collegato per javascript. Mi piacerebbe essere in grado di rimuovere più nodi (consecutivi) contemporaneamente, e mi chiedevo: è sufficiente tagliare solo le estremità di questi nodi più esterni che sto rimuovendo, o devo rimuovere ogni nodo singolarmente. Se capisco correttamente la garbage collection di javascript, una volta che nulla indica quei nodi consecutivi ancora più quando sono ancora connessi tra di loro, dovrebbero essere presi in carico dal garbage collector, è corretto? Se qualcuno potesse dirmi come potrei testarlo o verificarlo personalmente, lo apprezzerei molto.Chiusura e garbage collection: il modo più efficace per rimuovere nodi consecutivi da un elenco collegato

risposta

6

Secondo MDN:

A partire dal 2012, tutti i browser moderni spedire un mark-and-sweep garbage-collector. Tutti i miglioramenti apportati nel campo della garbage collection JavaScript (raccolta di dati generazionali/incrementali/concomitanti/paralleli) negli ultimi anni sono miglioramenti dell'implementazione di questo algoritmo, ma non miglioramenti sull'algoritmo di garbage collection stesso né sulla sua riduzione della definizione di quando "un oggetto non è più necessaria"

algoritmi Mark e spazzare cominciano dagli oggetti radice e trova tutti gli oggetti raggiungibili poi raccolgono tutte quelle non raggiungibili, così per questi browser recisione i nodi saranno bene. I browser più vecchi usano il conteggio dei riferimenti, il che significa che gli oggetti vengono raccolti solo quando hanno 0 riferimenti ad essi, quindi in questo caso i cicli di una lista doppiamente collegata saranno problematici. Dovresti quindi tagliare i cicli nei nodi consecutivi in ​​qualche modo (impostando i riferimenti su null, elimina la parola chiave, così via).

Quindi, se state sviluppando per moden browser siete tutti a posto, ma avrete bisogno di una soluzione leggermente più impegnativa se volete ripristinare la compatibilità con i browser come IE6/7 (è sempre il modo, non è vero? ..)

+0

Grazie! Ottimo collegamento pure. – DudeOnRock