28 messaggi dal 17 novembre 2005
ciao a tutti.
da qualche giorno sto impazzendo per capire dove sia il problema di una applicazione che sto scrivendo..
in pratica è un player mp3. pesca dei files in una directory e li suona in modo sequenziale, facendo una dissolvernza tra uno e l'altro lanciando i diversi mp3 su due diversi canali.

il problema è che il consumo della memoria è preoccupante.
apparentemente tutte le risorse sembrano venir rilasciate correttamente ma ad ogni passaggio di canzone, la memoria aumenta di qualche centinaio di kb.
ne mangia 300, poi ne perde 100, poi ne mangia 500 poi torna al livello di prima per poi andare a 100 in più rispetto a prima..

la cosa continua e dopo diverse ore il sistema va in errore per out of memory

se pero' minimizzo l'applicazione e poi la riporto attiva, la memoria utilizzata passa da 1GB (per es.) a pochi mega..
la cosa poi ricomincia, fino al prossimo minimizza/massimizza o out of memory.

sembra un problema di garbage collection ma nemmeno chiamando esplicitamente la funzione GC.Collect sembra risolvere la cosa.

è possibili monitorare la quantità di memoria utilizzata per capire chi se la mangia?
e perchè minimizzando l'applicazione sembra risolvere la cosa?

ringrazio l'anima pia che mi possa dare una mano in questa cosa :)

grazie
Ciao,

devi analizzare la tua applicazione con un profiler, puoi provare ad utilizzare quello built-in in Visual Studio Team System o acquistarne uno commerciale, come ANTS Profiler.

Ti sconsiglio vivamente di chiamare GC.Collect manualmente, non serve a nulla se non a peggiorare le prestazioni della tua applicazione: il GC si accorge da solo quando è in condizione di memory pressure e si preoccupa di liberare la memoria autonomamente; se non lo fa è perchè
1) hai oggetti in generazione 2 (e questo potrebbe essere causato da troppi GC.Collect "manuali"
2) hai oggetti Disposable di cui non invochi il metodo dispose, o con Finalizer ma non sono Disposable
3) hai oggetti che rimangono effettivamente raggiungibili nella tua applicazione e pertanto il GC non può rimuoverli.

Fossi in te, farei prima un'analisi qualitativa sul codice, verificando i 3 punti precedenti. Poi, se il problema non si risolve/mitiga drasticamente, andrei più a fondo con un profiler.

Ciao,
m.
28 messaggi dal 17 novembre 2005
grazie per i consigli utili.
sto facendo passare il codice riga per riga cercando di capire cosa non viene rilasciato.
il problema è che mi sembra tutto ok.. ma la soluzione è, come sempre, dietro l'angolo.

grazie ancora

ciao
10 messaggi dal 27 maggio 2008
Ricaordati che se utilizzi oggetti COM devi usare Marshal.ReleaseComObject();
gli oggetti COM sono abbastanza b*st*rdi, e non basta rilasciarli con .Dispose() [se lo implementano]
mi è capitato varie volte di leggere mp3 con oggetti com, ed avevo comportamenti come il tuo...
ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.