2009-12-05 12 views
5

Ho sentito che C# non libera memoria immediatamente anche se hai finito con esso. Posso forzare C# per liberare memoria?Posso forzare la pulizia della memoria in C#?

Sto utilizzando Visual Studio 2008 Express. È importante?

P.S. Non ho problemi con C# e come gestisce la memoria. Sono solo curioso.

+20

fermarlo. Non farlo. Lascialo da solo. Non osare. No. Non tuo. Vai via, pensa a qualcos'altro. – Will

+3

@Will. Toccato su un punto dolente ha fatto? –

+0

@Jim A meno che tu non sia un esperto e sappia cosa stai facendo, non lo farei. Anche da esperto non lo farei. Se ti stai trovando a dover chiamare il GC, scommetto che c'è un altro problema ... cioè una perdita di memoria *. –

risposta

17

Jim,

Hai sentito correttamente. Pulisce periodicamente la memoria attraverso un meccanismo chiamato Garbage Collector. Puoi "forzare" la garbage collection attraverso una chiamata come quella qui sotto.

GC.Collect(); 

Si consiglia vivamente di leggere this MSDN article on garbage collection.

MODIFICA 1: "Forza" era tra virgolette. Per essere più chiaro come un altro poster era, questo in realtà lo suggerisce. Non puoi davvero realizzarlo in un momento specifico. Da qui il link all'articolo sulla raccolta dei rifiuti in .Net

EDIT 2: Ho realizzato che qui solo forniva una risposta diretta alla tua domanda principale. Per quanto riguarda la tua domanda secondaria. Utilizzando Visual Studio 2008 Express verrà comunque utilizzato il framework .net, che è ciò che esegue la garbage collection. Pertanto, se esegui l'upgrade all'edizione professionale, avrai comunque le stesse capacità/limitazioni di gestione della memoria.

Modifica 3: This wikipedia aritcles on finalizers fornisce alcuni buoni indicatori di ciò che è appropriato fare in un finalizzatore. Fondamentalmente se stai creando un oggetto che ha accesso a risorse critiche, o se stai consumando un tale oggetto, implementa IDispose e/o sfrutta il usando la dichiarazione. L'utilizzo chiamerà automaticamente il metodo Dispose, anche quando vengono lanciate eccezioni. Ciò non significa che non è necessario dare la corsa finalizzatori suggerimento ...

+0

Grazie. Un sacco di informazioni lì. Buon articolo, esp. da quando vengo da uno sfondo C++. – jim

+0

Il link è rotto. Puoi aggiornarlo? – YukiNyaa

2

è possibile forzare il garbage collector per raccogliere oggetto referenziato tramite il metodo

GC.Collect() 

. La documentazione è here.

9

Non è possibile forza C# per liberare la memoria, ma è possibile richiesta che il CLR rilascia gli oggetti non referenziati chiamando

System.GC.Collect(); 

V'è un metodo WaitForPendingFinalizers che "sospende il thread corrente finché il thread che elabora la coda di finalizzatori ha svuotato quella coda." Anche se non dovresti aver bisogno di chiamarlo.

Come gli altri hanno suggerito di andare al MSDN per ulteriori informazioni.

+0

GC.RunFinalizers? dove è? Non riesco a trovarlo nel mio VS 2010 C# 4.0 –

+0

@ImranRizvi - a quanto pare è stato rimosso molto tempo fa - http://stackoverflow.com/a/12565583/59303. – ChrisF

+0

[documentazione MSDN] (https://msdn.microsoft.com/en-us/library/xe0c2357%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) in questo metodo afferma che * Forza un raccolta dei rifiuti immediata di tutte le generazioni * –

3

Si potrebbe dare un'occhiata a questo screencast^ da InfoQ.com. Presenta gli interni del .NET Garbage Collector.

+0

+1 Buona referenza! – CodeAngry

Problemi correlati