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?
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.
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:
La lingua che non consente l'aritmetica del puntatore si occupa di:
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 ++).
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.
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:
Leggi altre domande sui tag programming-languages c# java