Che cosa può o non può fare Garbage Collector?

8

Il GC si prenderà cura di tutti i problemi di gestione della memoria (perdite di memoria)?

C'è qualche caso in cui non vuoi che il GC prenda il controllo di una parte del tuo codice?

    
posta invariant 26.10.2011 - 18:04
fonte

4 risposte

10

Si prenderà cura dei problemi di gestione della memoria classica (la memoria allocata non viene cancellata quando non è più in uso), sebbene sia ancora possibile avere perdite di memoria con un sistema GC - questo sarà più sottile e si verificherà quando gli oggetti conservano ancora riferimenti ad altri oggetti, anche quando non ne hanno più bisogno.

Vedi la domanda Perché .NET non ha perdite di memoria ? e le sue risposte su StackOverflow.

Ci può x. situazioni in cui si desidera il pieno controllo dell'allocazione della memoria, ma, francamente, i vantaggi di un sistema GC sono tali che normalmente non è necessario.

    
risposta data 26.10.2011 - 18:07
fonte
2

Ci sono molti problemi di memoria (puntatori penzolanti, sovraccarichi del buffer e simili) e problemi relativi alle risorse (perdite di memoria, altre perdite di risorse). Garbage Collector si occupa di:

  • puntatori penzolanti
  • principalmente perdite di memoria
  • parzialmente altre perdite di risorse

La lingua che non consente l'aritmetica del puntatore si occupa di:

  • superamenti del buffer e altri casi di puntatori non validi

Né si possono risolvere altri casi di problemi di risorse in cui si dimentica di rimuovere il riferimento alla memoria / risorsa da qualche parte, quindi si può ancora avere perdite di memoria con GC (Gli oggetti di eccezione sono particolarmente importanti per fare riferimento a molte cose di cui non si è a conoscenza) .

Mentre GC può aiutarti a rilasciare altre risorse rispetto alla memoria utilizzando i finalizzatori (distruttori), rilascerà tali risorse con un ritardo non deterministico, che spesso non è appropriato per risorse come file o socket di rete. Per gestire questo tipo di problemi di risorse è necessario un costrutto linguistico per le risorse con scope come l'uso dell'istruzione in C #, l'idioma RAII in C ++ o l'ultima estensione per provare la sintassi in Java 7 ed è ancora di aiuto, perché è necessario utilizzarlo nel codice .

Non è possibile consentire l'aritmetica dei puntatori e la creazione di indirizzi da numeri per poter eseguire un garbage collector preciso. Alcune utili ottimizzazioni come la compattazione possono essere implementate solo in precisi collezionisti (puoi spostare oggetti solo se puoi dire con certezza che cos'è un riferimento, quindi puoi aggiornarlo, non puoi farlo in C / C ++).

    
risposta data 27.10.2011 - 11:02
fonte
1

La raccolta dei dati inutili funziona bene per la memoria. Se hai un sacco di memoria, perché correre a pulire ogni byte come è fatto? Generalmente, GC risponde alla "pressione della memoria" e pulisce quando necessario. Questa è una buona cosa per la memoria. Tuttavia, se si dispone di un oggetto che contiene una risorsa non di memoria (handle di file, connessione al database, blocco) in attesa che la pressione della memoria si inneschi, GC generalmente significherà tenere quella risorsa troppo a lungo. Hai bisogno di un altro approccio per quelle risorse. Ciò potrebbe significare un riferimento che conta la risorsa condivisa, con rilascio deterministico quando il conteggio dei riferimenti raggiunge lo zero o l'approccio di utilizzo / eliminazione di .NET.

    
risposta data 27.10.2011 - 14:35
fonte
0

I sistemi GC sono un software che tenta di ottimizzare l'utilizzo della memoria per un programma in esecuzione.

Il sistema GS è responsabile ed è un componente del framework (JVM / .NET).

Può liberare memoria per alcuni oggetti che prevede che non saranno necessari da un'applicazione dopo un determinato punto nell'elaborazione.

In .NET può liberare solo memoria per alcuni oggetti nativi .NET e non per MS COM object.

Gli oggetti MS COM utilizzati in .NET devono essere liberati esplicitamente.

References:

MSDN: Garbage Collection

Wikipedia: Collezione Gabage

    
risposta data 26.10.2011 - 18:35
fonte

Leggi altre domande sui tag