Sto lavorando a un'app per Windows Phone 8 e sto riscontrando un problema di perdita di memoria. Ma prima un po 'di storia. L'app funziona (sfortunatamente) usando WebBrowser come pagine. Le pagine sono piuttosto complesse con un sacco di javascript coinvolti.Cosa potrebbe causare questo problema di memoria?
La parte nativa dell'app, scritta in C#, è responsabile di alcune semplici comunicazioni con javascript (ad esempio, nativo è un delegato per javascript per comunicare con un server), crea animazione per la transizione delle pagine, il monitoraggio, la persistenza , ecc. Tutto è fatto in un'unica PhoneApplicationPage.
Dopo alcuni arresti anomali per le eccezioni di memoria, ho iniziato a profilare l'app. Vedo che i WebBrowser, che sono la parte principale dell'app, sono disposti correttamente. Ma il problema che sto vedendo è che la memoria continua ad aumentare. Quel che è peggio, ho un piccolo riscontro dal profiler. Da quanto ho capito, il grafico del profiler dice che c'è un grosso problema, mentre i numeri del profiler dicono che non c'è alcun problema ...
Nota: il passaggio rappresenta una navigazione da un browser web a un altro browser web. Lo spike viene creato (suppongo) dall'animazione tra i due controlli. Nello span che ho selezionato nell'immagine, stavo facendo una navigazione in avanti e una all'indietro con un massimo di 5 WebBrowser (2 per i menu che sono sempre lì, 1 per la pagina indice, 1 per la pagina da cui mi muovo e 1 per la pagina verso cui navigo). Ad ogni navigazione il profiler mostra il numero corretto di WebBrowser: 5 dopo aver navigato in avanti, 4 dopo aver navigato indietro.
Nota 2: ho aggiunto la linea rossa per rendere più chiaro che la memoria sta andando in quel lasso di tempo
Come si può vedere dall'immagine l'utilizzo della memoria è abbastanza grande ma i numeri Diciamo che è basso e in quel lasso di tempo, l'allocazione mantenuta è inferiore a quando è iniziata ...
Spero di aver inserito abbastanza informazioni. Voglio alcune idee su cosa potrebbe causare questo problema. Le mie idee finora sono:
-la javascript nel WebBrowser sta facendo qualcosa di sbagliato (ad esempio non pulendo qualche gestore di eventi). Anche se questo è il caso, il WebBrowser non dovrebbe rilasciare la memoria quando viene distrutta?
-utilizzare una PhoneApplicationPage univoca è qualcosa di malvagio che non dovrebbe essere fatto e cambiarne la struttura potrebbe causare questo.
-other?
Un'altra domanda: perché il grafico mostra la quantità corretta di memoria utilizzata mentre il numero non lo fa?
Se hai bisogno di maggiori informazioni sul profiler, chiedi e le posterò domani.
'perché fa il grafico mostra la quantità corretta di utilizzo di memoria, mentre il numero non lo fanno?' I "numeri" mostrano solo la quantità di memoria gestita sei consumando. Significa semplicemente che il resto viene consumato dal codice nativo (il che rende il WebBrowser un colpevole allettante). Sfortunatamente, non ci sono abbastanza informazioni per trovare la causa principale. Se si crea un progetto semplice con un singolo WebBrowser, quindi si tenta di utilizzare la logica simile all'applicazione (distruggendo e ricreando istanze di browser Web), è possibile riprodurre la perdita? Se è così, si prega di indicare come riprodurlo da parte mia e potrei essere in grado di aiutare –
@KooKiz Ho provato a creare un progetto più semplice in cui aggiungo e rimuovo WebBrowser dalla pagina ma funziona correttamente e non trattiene memoria . ora sto cercando di riprodurre la comunicazione più complicata che si verifica tra l'aggiunta e la rimozione dei WebBrowser. –