2012-02-01 14 views
8

All'interno di un'applicazione complessa con multithreading, si verificano eccezioni di memoria insufficiente una volta alla settimana. L'applicazione sta inviando/leggendo enormi quantità di dati tramite diversi socket, in cui i dati letti vengono memorizzati nella cache per evitare sovraccarichi del buffer delle schede di rete.
Qual è la migliore strategia per analizzare le eccezioni di memoria? Durante il normale periodo di esecuzione, l'app viene visualizzata con una dimensione di "Totale byte in tutti gli heap" fino a 1,5 Gigabyte in Process explorer.
Potrebbe essere una strategia per avere un filo che è polling siaC# Eccezione di memoria esaurita - strategia di avviso

GC.GetTotalMemory()

o

PrivateMemorySize64()

una volta secondo a sapere quando iniziare ad analizzare le cose? Non ho ancora esaminato i profiler commerciali e sono un po 'preoccupato del loro impatto sulle prestazioni che potrebbe fornire anche risultati errati riguardo all'analisi dei problemi.

+1

Come funziona il caching? Analizzerei una strategia di allocazione diversa per il tuo caching. – CodesInChaos

+0

Per chiarire, sai quali sono le cause dell'eccezione di memoria insufficiente e stai cercando solo un modo per configurare la cache nella tua applicazione in modo che ciò non accada? O forse non sai cosa lo causa esattamente e vuoi risolvere il problema? – svick

risposta

3

Probabilmente la memoria è frammentata da numerose operazioni con le stringhe o da altre operazioni che creano e rilasciano piccoli blocchi di memoria, come il boxing/unboxing.

Si otterrà questa eccezione quando il CLR non è in grado di allocare un blocco di memoria libero sufficientemente grande.

Uso il "CLR Profiler" e controllo le allocazioni di memoria. Se vedi numerosi punti bianchi (blocchi liberi) e nessun blocco libero di grandi dimensioni, allora devi iniziare a guardare come stai allocando gli oggetti.

Ad esempio, prima di assegnare una stringa a un'altra, verificare prima se le stringhe sono diverse. L'uso di StringBuilder è in tutti i casi, elimina la boxe e altre ottimizzazioni della memoria.

Io uso questa tecnica e completamente eliminato le eccezioni, ad eccezione di un problema noto con la de-serializzazione binaria.

riscoprire l'arte perduta di ottimizzazione della memoria nel codice gestito a http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

Indagare memoria Problemi a http://msdn.microsoft.com/en-us/magazine/cc163528.aspx

ottimizzazione delle prestazioni in Visual Basic .NET a http://msdn.microsoft.com/en-us/library/aa289513 (v = vs.71) .aspx

+2

La maggior parte delle stringhe dovrebbe essere rilocabile e quindi non dovrebbe causare la frammentazione della memoria. La frammentazione LoH può essere un problema, ma se usi molte stringhe abbastanza grandi da finire sul LoH probabilmente stai facendo qualcosa di sbagliato. – CodesInChaos

+0

Cosa intendi per altre ottimizzazioni della memoria? In una parte sto usando grosse divisioni, regex, stack ed elenchi. È necessario ricontrollare per il boxing – weismat

+0

Non è possibile riposizionare la memoria se non c'è un blocco abbastanza grande. Questo è il motivo per cui viene lanciata l'eccezione out-of-memory. Non ho mai visto LOH causare eccezioni out-of-memory. Ecco a cosa serve, un mucchio di grandi blocchi di memoria possono essere allocati senza la necessità di trovare un grande blocco continuo di memoria libero. – AMissico

0

Come utilizzare i riferimenti deboli per la memorizzazione nella cache? clicky

+3

Solo per FYI, questo è tratto dalle linee Guildlines di Weak References: "Evita di utilizzare riferimenti deboli come soluzione automatica ai problemi di gestione della memoria, invece di sviluppare una politica di caching efficace per la gestione degli oggetti dell'applicazione". –

+0

Non ci sono molti posti in cui i riferimenti deboli potrebbero essere d'aiuto - penso che dividerei il processo in due prima per raddoppiare lo spazio dati disponibile. Ho evitato questo per ragioni amministrative finora. – weismat

1

Si potrebbe prendere in considerazione l'installazione degli strumenti di debug per Windows e utilizzando adplus

ADPlus.vbs (ADPlus) è uno strumento da Microsoft Product Support Services (PSS) che possono risolvere qualsiasi processo o applicazione che si ferma rispondere (si blocca) o fallisce (si blocca).

Fondamentalmente, è possibile impostare che guardando l'applicazione, e quando si blocca, acquisirà un dump, che è quindi possibile analizzare utilizzando WinDBG/SOS.

+0

Potrei seguire questa strada - credo che lo aggiungerò alla mia lista di attività schedulate, in modo che inizi ogni giorno poiché ogni giorno richiederà un nuovo inizio (dato che anche l'exe inizia ogni giorno). – weismat

1

è possibile utilizzare un MemoryFailPoint per cercare di dare alcune garanzie su una data operazione

Ma vi consiglio isolare il processo che la vostra applicazione è in esecuzione in, passare a 64 bit se questa è un'opzione e potrebbe essere necessario cerca di ridurre alcune prestazioni per darti garanzie ragionevoli sull'utilizzo della memoria.

Problemi correlati