2012-02-26 24 views

risposta

10

Ecco un estratto da non vengono mai esplicitamente distrutti i language reference

oggetti; tuttavia, quando diventano irraggiungibili, possono essere raccolti dalla spazzatura. Un'implementazione può posticipare la garbage collection o ometterla del tutto - è una questione di qualità dell'implementazione come viene implementata la garbage collection, purché non siano raccolti oggetti che sono ancora raggiungibili.

CPython dettaglio implementativo: CPython attualmente utilizza uno schema di riferimento conteggio con (opzionale) ritardato rilevamento di immondizia ciclicamente collegata, che raccoglie maggior parte degli oggetti non appena diventano irraggiungibili, ma non è garantito per raccogliere i rifiuti contenenti riferimenti circolari . Consultare la documentazione del modulo gc per informazioni sul controllo della raccolta di rifiuti ciclici. Altre implementazioni agiscono in modo diverso e CPython potrebbe cambiare. Non dipendere dalla finalizzazione immediata degli oggetti quando diventano irraggiungibili (es: file sempre chiusi).

EDIT: A proposito di rimandare la raccolta dei rifiuti .... il modulo gc permette di interagire con il garbage collector, e disattivarla se si desidera e cambiare la frequenza di raccolta ecc, ma non l'ho usato io. Inoltre, cicli che contengono oggetti con i metodi __del__are not collected.

+0

Nizza, anche se piuttosto fauge. Hai idea di come emetti o rimandi gc? –

+0

Questa è una domanda diversa, Matt Alcock e la risposta è disponibile. – erisco

+0

@MattAlcock: emettere o posticipare gc? (1) Questa è una domanda a parte. E. (2) Perché vorresti? Se non si desidera che una raccolta dati venga raccolta, assegnarla a una variabile. –

11

Quando gli oggetti vengono raccolti in Python?

C'è molto dettaglio nel codice sorgente per CPython: http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup

Ogni volta che un conteggio di riferimento scende a zero, l'oggetto viene immediatamente rimosso.

293/* gc ciclico di Python non dovrebbe mai vedere una refcount in entrata

294 * di 0: se qualcosa decref'ed a 0, che avrebbe dovuto essere

295 * deallocata subito in quel momento .

Una raccolta completa viene attivata quando il numero di nuovi oggetti è maggiore del 25% del numero di oggetti esistenti.

87 In aggiunta alle varie soglie configurabili, abbiamo solo innescare una

88 completa raccolta se il rapporto

89 long_lived_pending/long_lived_total

90 è superiore ad un dato valore (cablato a 25%).

Quando viene rilasciata la memoria?

sono riuscito a ripescare queste informazioni solo.

781/* cancellare tutti gli elenchi liberi

782 * Tutte le liste libero sono cancellate durante la raccolta della più alta generazione.

783 * Gli articoli allocati nell'elenco libero possono mantenere occupato un arena pymalloc .

784 * Azzeramento delle liste libere possono restituire la memoria al sistema operativo precedente.

785 */

In base a questo, Python potrebbe essere mantenere il vostro oggetto in una lista libera per il riciclaggio, anche se si lascia cadere la sua refcount a zero. Non riesco a trovare esplicitamente quando viene effettuata la chiamata gratuita per restituire memoria al sistema operativo, ma immagino che ciò avvenga quando viene creata una raccolta e l'oggetto non viene tenuto in una lista libera.

fa la prestazione impatto collezione?

Qualunque non banale garbage collector Ho sentito richiede sia CPU e la memoria per funzionare. Pertanto, sì, c'è sempre un impatto sulle prestazioni. Dovrai sperimentare e conoscere il tuo garbage collector.

I programmi che richiedono vera reattività volta che hanno incontrato problemi con, in quanto netturbini non mi concedono il controllo su quando corrono o per quanto tempo lo fanno. Alcuni casi particolari possono causare anche un uso eccessivo della memoria, un esempio è l'abilità di Python per mantenere le liste libere.

Problemi correlati