2011-10-26 10 views
7

Sto sviluppando un'applicazione C# che sembra avere una perdita. Ho usato la memoria profiler e ho scoperto che il mioCome risolvere la perdita di byte privati ​​(memoria nativa)?

privato byte continuare ad aumentare, ma byte in tutti gli heap no, il che significa che probabilmente si tratta di una memoria nativa fuoriuscire

Ora mi sono bloccato, come posso trovare perdite di memoria nel codice nativo?

+0

Sai dov'è la perdita? Non possiamo aiutarti senza il codice ... –

+0

Non scrivi codice nativo in C#. Sicuramente l'unica cosa che puoi fare è assicurarti di gestire correttamente InterOp? –

+0

Questo è un problema comune con i profiler, ti dicono più di quello che volevi sapere. Crescere byte privati ​​non è inusuale, può richiedere del tempo prima che si stabilizzi. Ottieni effettivamente eccezioni OutOfMemory? In caso contrario, lanciare il bit ignore per questo. –

risposta

0

È difficile fornire una risposta solida senza ulteriori informazioni, ma sembra che la lib che si sta tentando di utilizzare abbia una perdita di memoria. Avrai bisogno della lib con gli strumenti appropriati, a seconda della lingua in cui è stata scritta. Se non hai la fonte della lib, contatta gli sviluppatori e chiedi loro di correggere la perdita.

Se è possibile inserire il nome della libreria e parte del codice sorgente (nonché le firme dei metodi nativi), potremmo essere in grado di darvi qualche consiglio più specifico.

0

byte privati ​​in heap gestiti da .net framework, è necessario utilizzare uno strumento professionale per analizzare la fonte. tale mi piace usare il profiler della memoria della porta rossa, trovare l'oggetto creato ma non disposto.

3

Diagnosi di perdite di memoria nativa in un'applicazione gestita è (almeno inizialmente) molto simile alla diagnosi di perdite di memoria in qualsiasi altra applicazione nativa.

Il modo in cui normalmente mi avvicino a questi problemi è far sì che il processo perda una grande quantità di memoria, eseguire un dump completo del processo e quindi esaminare il dump per vedere che cosa sta utilizzando la maggior quantità di memoria. Ad esempio se il tuo processo ha un normale/iniziale byte privato di ~ 20MB ma puoi far sì che il tuo processo perdi memoria finché non ha ~ 200MB di byte privati, allora c'è una buona probabilità che vengano persi circa 180MB di quella memoria - generalmente parlando qualunque cosa abbia più memoria allocata è dove dovresti iniziare a cercare.

Microsoft ha uno strumento molto utile chiamato DebugDiag - inizialmente sviluppato per l'utilizzo nella diagnosi di perdite di memoria in IIS è uno strumento molto vesatile e molto utile quando si affrontano problemi di memoria. Se gli dai un crash dump, eseguirà alcune analisi e dovrebbe (come minimo) dirti quale modulo ha allocato tutta quella memoria, puoi quindi iniziare a guardare in modo specifico a come quel modulo viene usato.

0

Di solito ho ottenuto i migliori risultati quando ho rilevato perdite di memoria utilizzando lo ANTS Memory Profiler.

(Or other tools, personalmente ho avuto esperienze migliori con le formiche)

3

primo luogo, se si dispone di un dump del processo che perde, è possibile aprirlo in WinDbg e lanciare il comando:! affrontare -SOMMARIO

  • se RegionUsageHeap è grande, quindi dovrebbe essere una perdita di memoria nativa
  • se RegionUsageIsVAD, quindi dovrebbe essere una perdita di memoria .NET.

Se si tratta di una perdita di nativo, allora si hanno 2 opzioni:

  • Usa DebugDiag: quando richiesto, scegliere 'perdita di memoria dei nativi e perdita di handle', selezionare il processo che si desidera diagnosticare, e iniziare a lavorare con l'applicazione fino a quando non si sperimenta la perdita di memoria. Al termine, generare un dump completo dell'applicazione (fare clic con il pulsante destro del mouse sulla regola di perdita e selezionare Scarico completo utente). È quindi possibile analizzare il dump generato (è necessario che i simboli siano configurati correttamente affinché funzioni in modo efficiente): nella scheda 'analisi avanzata', selezionare 'Analizzatori di pressione di memoria', aprire il file di dump e premere 'Inizia analisi'. Questo produce e html report che puoi analizzare. È possibile fare riferimento a questo page per una dettagliata procedura dettagliata.

  • Usa Application Verifier/WinDbg. Nel verificatore dell'applicazione, seleziona la tua applicazione (.exe). Nella pagina di test, assicurati che Basics/Heaps sia selezionato. Nel riquadro inferiore, assicurati che 'Traces' sia impostato su true. Una volta salvata la configurazione, rieseguire l'applicazione e generare un dump completo quando si verifica la perdita. Non dimenticare di pulire i flag dell'applicazione dopo che il dump è stato generato. Quindi è possibile aprire il dump da WinDbg e analizzare la perdita con l'aiuto del comando '! Heap'. In particolare, '! Heap -l' ti fornirà un elenco di blocchi trapelati, '! Heap -p -a' mostrerà i dettagli di un blocco, incluso lo stack di allocazione delle chiamate.

Se si tratta di una perdita .NET, esistono strumenti di terze parti per la risoluzione dei problemi. A partire dalla versione 1.2, DebugDiag è anche in grado di eseguire l'analisi della perdita di memoria .NET (mai provato comunque).