Un sacco di soluzioni utili sono già state suggerite e l'articolo MSDN è molto completo. In combinazione con i suggerimenti di cui sopra farei anche quanto segue;
Correlare l'ora dell'eccezione con il file di registro per vedere cosa stava accadendo al momento dell'eccezione OOM. Se hai poca registrazione a livello di informazioni o di debug ti suggerirei di aggiungere alcune registrazioni in modo da avere un'idea del contesto intorno a questo errore.
L'utilizzo della memoria aumenta gradualmente per un lungo periodo di tempo prima che l'eccezione (ad esempio un processo server che viene eseguito indefinitamente) o un salto di grandi dimensioni aumenti abbastanza rapidamente fino all'eccezione?Ci sono molti thread in esecuzione o solo uno?
Se il primo è vero e l'eccezione non si verifica per un lungo periodo, ciò significherebbe che le perdite di risorse stanno perdendo come sopra indicato. Se il più tardi è vero, un certo numero di cose potrebbe contribuire alla causa, ad es. un ciclo che assegna un sacco di memoria per iterazione, ricevendo un insieme molto ampio di risultati da un servizio ecc. ecc.
In entrambi i casi il file di registro dovrebbe fornire sufficienti informazioni su dove iniziare. Da lì mi sarei assicurato di poter ricreare l'errore emettendo un certo insieme di comandi nell'interfaccia o utilizzando un insieme coerente di input. Successivamente, a seconda dello stato del codice, proverei (con l'uso delle informazioni del file di registro) per creare alcuni test di integrazione che hanno come target la fonte presunta del problema. Questo dovrebbe permetterti di ricreare la condizione di errore molto più velocemente e renderlo molto più facile da trovare poiché il codice su cui ti stai concentrando sarà molto più piccolo.
Altre cose che tendo a fare è un codice di memoria surround con una piccola classe di profiling. Questo può registrare l'utilizzo della memoria nel file di registro e darvi visibilità immediata dei problemi nel registro. La classe può essere ottimizzata in modo che non sia compilata in versioni di rilascio o abbia un piccolo sovraccarico di prestazioni (se hai bisogno di maggiori informazioni contattami). Questo tipo di approccio non funziona bene quando vengono allocati molti thread
Hai menzionato le risorse non gestite presumo che tutto il codice che hai scritto tu/il tuo team sia gestito? Se no e se possibile circonderei i confini non gestiti con una classe di profilazione simile a quella menzionata sopra per escludere le perdite dal codice non gestito o da un'interoperabilità. Anche il blocco di molti puntatori non gestiti può causare la frammentazione dell'heap ma, se non si dispone di codice non gestito, entrambi questi punti possono essere ignorati.
Chiamare esplicitamente il garbage collector in un commento precedente è stato sconsigliato. Anche se raramente dovresti farlo, ci sono dei momenti in cui è valido (cerca gli esempi del blog di Rico Mariani). Un esempio (coperto nel blog menzionato) in cui ho chiamato esplicitamente collect è quando grandi quantità di stringhe sono state restituite da un servizio, inserite in un set di dati e poi legate a una griglia. Anche dopo la chiusura dello schermo, questa memoria non è stata raccolta per qualche tempo. In generale, non dovrebbe essere chiamato esplicitamente in quanto il garbage collector mantiene le metriche su cui basa (tra le altre cose) le collezioni. La chiamata collect invalida esplicitamente queste metriche.
Infine, è generalmente opportuno avere un'idea dei requisiti di memoria dell'applicazione. Ottenere ciò registrando ulteriori informazioni, eseguendo occasionalmente i test di profiler, stress/unità/integrazione. Prendi un'idea dell'impatto che una determinata operazione ha con un livello elevato, ad es. sulla base di un insieme di input all'incirca x sarà assegnato. Comprendo ciò, disconnettendo informazioni dettagliate in punti strategici nel file di registro. Un file di registro gonfio può essere difficile da capire o interpretare.
IMHO, in questo caso prendere l'eccezione usando il debugger sarà inutile, il danno (probabilmente la perdita di memoria) è già stato fatto altrove. – Naveen
Basta buttare fuori un paio di opzioni. Non posso far male a guardare. – tsilb
tslib ha un punto, a volte è possibile restringere quando si esaurisce la memoria. – Gregory