2012-02-21 12 views
6

Ciao, ho un bel problema con un servizio che esegue WCF in modalità duplex. Invia memoria (non molto ma si tratta di 80 MB al giorno) e dopo aver avuto un profiler di memoria in esecuzione sul servizio per 24 ore ho trovato la maggior parte della memoria seduta in byte[] riferita da un bel pasticcio ma la maggior parte dei riferimenti termina in qualcosa di simile questo: one path holding the byte[] - array e il "root" si presenta così: rootPerdita di memoria in WCF (duplex) sul server

troppo vedo un sacco di ServiceChannel (circa 200) ritornassi (credo) dalle callback canali.

Sono piuttosto sicuro di tenere solo 1 di questi per ciascun client collegato.

Nel complesso il mio problema sembra essere quasi lo stesso di questo: memory leak in silverlight Wcf implementation ma sul lato server.

Ho anche provato la cosa [MTAThread] menzionata qui: WCF service leaks handles and memory when a client times out ma non risolve il problema.

Semplicemente non penso che il problema sia con il mio codice mentre avvolgo i canali di callback dopo averlo ottenuto con OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>() in uno dei miei oggetti e quelli non perdono (ce n'è solo uno per quelli i client in memoria in ogni istantanea data) - sicuro di reimpostare quei callback in diverse occasioni in quanto il canale potrebbe cambiare (i client perdono la connessione o la riconnessione) ma non ho un modo di smaltire i vecchi riferimenti in modo da lasciarli solo e GC dovrebbe fare il suo lavoro su di loro.

Io uso PerCall sul mio servizio quindi non ho alcuna maniglia per quegli oggetti nel mio codice.

Io davvero non hanno idea di come posso gestire questa parte riavviando il servizio ogni pochi giorni - una soluzione che non voglio probose adesso :(

Quindi, per favore mi dia qualche aiuto/suggerimenti su questo - grazie mille!

+0

Vedete un guadagno di memoria più alto se i client commettono un errore eccessivo e dovete ricreare il canale di callback? Interrompi il canale di callback se il cliente è andato via? –

+0

E 'difficile per me dirlo, ma potrebbe essere il caso - e no non abortire il canale sul server (come posso fare questo - usando 'GetCallbackChannel ' Ho solo' T '- devi lanciare questo in una specie di proxy?) – Carsten

+1

Dovresti essere in grado di trasmetterlo a 'IClientChannel' –

risposta

7

Quando un canale basato su sessione fa un errore, una chiamata a Close genererà un'eccezione, ma in questo caso ci sono risorse sul lato proxy che non vengono ripulite e queste vengono pulite solo quando si Abort il canale in errore

Assicurarsi che quando si sostituisce un errore editore che hai Abort il vecchio prima

+0

grazie mille! – Carsten