2010-04-15 14 views
6

Mi chiedevo se esiste un metodo .finalize() simile per gli oggetti Ruby, che li contrassegna pronti per la garbage collection. Se creerei 20.000 oggetti e ogni istanza abbia un contatore, vorrei che l'oggetto fosse marcato per la garbage collection quando raggiunge zero. So che questo è più o meno un approccio Java, ma non ho esperienza sufficiente con Ruby per capire come ciò potrebbe essere fatto meglio.Ruby: Contrassegna un oggetto per la garbage collection

Grazie per le vostre risposte, commenti e feedback!

+2

finalize non contrassegna gli oggetti per la garbage collection, è un metodo che viene eseguito (anche se non c'è garanzia) appena prima che il GC cancelli l'oggetto – pablochan

+0

Questo è bello sapere, grazie per averlo indicato. Esiste un metodo specifico che distrugge esplicitamente l'oggetto o almeno lo mette in movimento? Mi piace la magia, ma mi piace anche capire i trucchi esposti. – Shyam

+1

Hai solo bisogno di rimuovere tutti i riferimenti all'oggetto e. g. se hai un riferimento x lo imposti su null o hai una variabile locale che diventa fuori portata. Se non ci sono riferimenti, un oggetto è disponibile per il GC. – pablochan

risposta

7

Per quanto ne so, non è possibile contrassegnare un oggetto pronto per GC, ma è possibile forzare GC in qualsiasi momento:

GC.start 

Se l'articolo può essere liberato, si saranno liberati.

+5

Non più vero dal MRI 1.9.3 ha introdotto lo sweep pigro GC – glebm

+1

Questa parte è ancora vera però: "non è possibile contrassegnare un oggetto pronto per GC". Ruby usa l'approccio opposto: gli oggetti che possono essere raggiunti sono contrassegnati come "non rimuovere". Tutto il resto viene liberato al termine della fase di mark. Questo non è cambiato, semplicemente non accade immediatamente quando chiami 'GC.start' –