/ / GC.Collect call e OutOfMemory - .net, garbage collection, memoria insufficiente

GC.Collect call e OutOfMemory - .net, garbage-collection, out-of-memory

Quando chiamo GC.Collect tutto funziona bene. Ma se commento questa chiamata, di tanto in tanto ricevo OutOfMemory. Sembra molto strano. Come trovare questo bug?

informazioni addizionali Sulution dell'applicazione ha alcuni progetti che hanno riferimenti a diversi framework da 2.0 a 4.0 Aplication è un'applicazione per moduli Windows, devexpress usato.

risposte:

2 per risposta № 1

Le varianti più probabili:

  1. Frammentazione dell'heap di oggetti di grandi dimensioni. Nell'applicazione viene utilizzata una grande quantità di raccolte di grandi dimensioni fino a milioni di elementi, come HashSet, Dizionario e così via. Tutti chiamano Array.Resize di volta in volta. Quindi, GC.Collect non risolve il problema, ma rallenta la frammentazione.
  2. codice non gestito

Modificato: 3. System.Drawing tende a generare eccezioni OOM in alcuni casi


1 per risposta № 2

Probabilmente ti dimentichi di disporre di un oggetto. Utilizzi database o altre risorse esterne?


1 per risposta № 3

Se devi chiamare GC.Collect, allora qualcosa non va. Di solito non è necessario chiamare il garbage collector.

  1. Prova un profiler di memoria. Questo ti mostrerà quanti oggetti di quale tipo consumano il tuo heap.
  2. Controlla le risorse non gestite. Ogni risorsa non gestita deve essere gestita da una classe che implementa IDispoable insieme a un finalizzatore.

0 per risposta № 4

Un approccio comune per il debug di perdite di memoria in .net è l'uso di sos-Extension (troverai alcuni tutorial come Questo se fai qualche ricerca) o per usare un profiler di memoria, come Questo uno. Maby, hai appena dimenticato di rilasciare (smaltire) alcune risorse non gestite?


0 per risposta № 5

Vorrei provare a eseguire il debug dei problemi di memoria gestita con Profiler CLR.

Inoltre, perché chiami GC.Collect () da solo? Questo di solito è un anti-pattern.