2010-06-01 15 views
5

Ho la situazione in cui il ciclo di caricamento e chiusura di un documento consuma pochi Mb di RAM. Questa memoria non è trapelata come qualcosa che lo possiede e lo pulisce quando l'app esce (Visual Leak Detector e lo strumento Mac Leaks mostrano accordo su questo). Tuttavia, mi piacerebbe scoprire dove sta andando. Presumo che si tratti di una sorta di cache nell'applicazione che viene popolata quando il documento viene caricato ma non liberato quando il documento viene chiuso. Quali metodi o strumenti posso utilizzare per scoprire dove vengono effettuate queste allocazioni?Come scoprire dove sta andando la mia memoria

UPDATE:

seguente post di Hans ho aggiunto un ciclo per l'applicazione per i documenti più volte di apertura e chiusura. Ho scoperto che c'era un salto iniziale nell'utilizzo della memoria ('Byte privati' come riportato da Process Explorer) dopo aver caricato il primo paio di documenti, ma poi non è più aumentato ogni volta. Quindi questo suggerisce che non ci sono nuove allocazioni, e l'aumento apparente è probabilmente dovuto principalmente a un artefatto del paging.

Ho anche dato un'occhiata più da vicino a Strumenti sul Mac, che è stato utile per vedere dove stavano accadendo le allocazioni: creare uno strumento composto dagli strumenti Allocations and Leaks quindi aggiungere un'istantanea heap all'inizio e alla fine di un cicla e nell'elenco Heapshots mostrerà tutti i delta di allocazione relativi all'ultima istantanea. Ciò suggerisce che sul Mac le allocazioni di memoria erano aumentate di ma erano dovute a cache interne come il disegno di CoreGraphics, su cui abbiamo un controllo limitato.

+0

Se apri/chiudi apri/chiudi apri/chiudi mangia un paio di Mb in più ogni volta che apri/chiudi o raggiunge solo una dimensione fissa dopo il primo tentativo. Inoltre, come stai misurando la memoria utilizzata? –

risposta

2

Partendo dal presupposto che sia in realtà la RAM che hai misurato: certo questo è del tutto normale. Il tuo programma sta affrontando attivamente le pagine di memoria virtuale quando carica un documento, verrà mappato alla RAM. Rimarranno lì fino a quando un altro processo non avrà bisogno di avere pagine mappate su RAM. Alcuni sistemi operativi eliminano il set di lavoro in modo preventivo, ad esempio su Windows quando le finestre dell'app vengono ridotte a icona.

Se in realtà sono le pagine di memoria virtuale che hai misurato: anche questo è normale. Dopo aver rilasciato la memoria, i blocchi heap vengono aggiunti all'elenco dei blocchi liberi, pronti per essere utilizzati dalla successiva allocazione di memoria. Se rilasciando la memoria capita di liberare un'intera gamma di pagine, allora il gestore della memoria ha l'opportunità di annullare la mappatura di quell'intervallo. Non succede spesso ed è un dettaglio di implementazione del tuo gestore della memoria quanto lo fa aggressivamente.

+0

Commenti utili - Non l'avevo considerato. Forse ho bisogno di eseguire un test case in cui l'app aprirà e chiuderà ripetutamente i file per vedere se sta allocando più memoria o se è solo una stranezza del paging. Il valore che sto misurando è 'Byte privati' come riportato da Process Explorer. –

+0

Questa è la memoria virtuale, non la RAM. Include blocchi liberi nell'heap. –

2

Beh, in realtà hai una perdita. Quando l'applicazione esce dal SO pulisce tutte le risorse: nessuna perdita di applicazioni nel senso che lascia la memoria assegnata in modo permanente dopo la sua chiusura. XCode ha uno strumento per aiutarti a identificare le perdite.
Guarda sotto

Run->Run with performance Tool->Leaks
Questo eseguirà la tua applicazione con un codice che ti aiuterà a trovare le perdite.

+0

Ho dimenticato: ti fornirà anche uno strumento visivo per osservare cosa è stato trapelato e lo stack di chiamate che ha portato alla perdita. – garph0

+0

Ho già detto che ho già eseguito Leaks e non ha riscontrato alcun problema. Molto probabilmente la memoria è allocata da una cache all'interno dell'applicazione e tale cache viene liberata correttamente all'uscita dell'applicazione. La mia domanda è: come faccio a trovare quale cache specifica è responsabile di tutta la memoria in modo che io possa svuotarla quando chiudo un documento? –

+0

Il mio male: non mi ero reso conto che intendevi lo strumento per le prestazioni di Xcode Leaks. Era rilevatore di perdite visive o perdite di Mac? – garph0

4

Se è possibile riprodurlo in modo affidabile, è possibile utilizzare l'heap di debug in MS CRT per risolvere il problema. Inizia qui: Memory Leak Detection and Isolation

+0

Posso provarlo, non ho provato a utilizzare le routine di MS CRT per alcuni anni, come in passato non erano stati creati con il nostro codebase. Penso che fosse qualcosa come l'uso del "posizionamento nuovo" che non gli piaceva. –

0

Potrebbe essere utile a qualcuno. Ho pensato che Xcode 4.2 con il rilevamento di oggetti zombi attivato (una casella di controllo in modifica schema) mangia memoria come un pazzo - ~ 4GB in un min. Assicurati di controllare questo nel caso in cui la tua app mangia memoria in esecuzione in Xcode e non altrimenti. Anche gli strumenti di allocazione della memoria e perdite non danno nulla.

Problemi correlati