2010-06-01 16 views
5

Tengo la situación en la que el ciclo de carga y cierre de un documento consume unos pocos Mb de RAM. Esta memoria no se ha filtrado como algo lo posee y lo limpia cuando se cierra la aplicación (Visual Leak Detector y la herramienta Mac Leaks muestran un acuerdo al respecto). Sin embargo, me gustaría saber a dónde va. Supongo que es una especie de caché en la aplicación que se llena cuando el documento se carga pero no se libera cuando se cierra el documento. ¿Qué métodos o herramientas podría usar para averiguar dónde se están realizando estas asignaciones?Cómo saber dónde va mi memoria

ACTUALIZACIÓN:

siguiente post de Hans he añadido un bucle para la aplicación a los documentos en varias ocasiones se abren y cierran. Descubrí que hubo un salto inicial en el uso de la memoria ('Bytes privados' según lo informado por Process Explorer) después de cargar los primeros dos documentos, pero luego ya no aumentaba cada vez. Así que esto sugiere que no hay nuevas asignaciones, y es probable que el aumento aparente se deba principalmente a un artefacto de paginación.

También he echado un vistazo más de cerca a los instrumentos en el mac, que fue útil para ver dónde estaban ocurriendo las asignaciones: crear un instrumento compuesto por las herramientas de asignaciones y fugas y luego agregar una instantánea de montón al inicio y al final de un ciclo y en la lista de Heapshots mostrará todos los deltas de asignación relativos a la última instantánea. Esto sugiere que en Mac las asignaciones de memoria fueron en aumento, pero se debió a cachés internos como el dibujo de CoreGraphics, sobre el cual tenemos poco control.

+0

Si abre/cierra abrir/cerrar abrir/cerrar, come un par de Mb más cada vez que abre/cierra o simplemente alcanza un tamaño fijo después del primer intento. Además, ¿cómo estás midiendo la memoria utilizada? –

Respuesta

2

Trabajando desde la suposición de que en realidad es la memoria RAM que ha medido: seguro, esto es completamente normal. Su programa se dirige activamente a las páginas de memoria virtual cuando carga un documento, se asignará a la memoria RAM. Permanecerán allí hasta que otro proceso necesite tener páginas asignadas a la RAM. Algunos sistemas operativos recortan el conjunto de trabajo de forma preventiva, en Windows, por ejemplo, cuando se minimizan las ventanas de la aplicación.

Si es en realidad las páginas de memoria virtual que ha medido: eso es normal también. Después de liberar la memoria, los bloques de almacenamiento se agregan a la lista de bloques libres, listos para ser utilizados por la siguiente asignación de memoria. Si liberar la memoria pasa a liberar un rango completo de páginas, entonces el administrador de memoria tiene la oportunidad de desasignar ese rango. No sucede a menudo y es un detalle de implementación de su administrador de memoria lo agresivo que lo hace.

+0

Comentarios útiles - No lo había considerado. Tal vez deba ejecutar un caso de prueba en el que la aplicación abra y cierre repetidamente los archivos para ver si realmente está asignando más memoria o si es solo una peculiaridad de la paginación. El valor que estoy midiendo es 'Bytes privados' según lo informado por Process Explorer. –

+0

Eso es memoria virtual, no RAM. Incluye bloques gratis en el montón. –

2

Bueno, en realidad tiene una filtración. Cuando la aplicación sale del sistema operativo, se limpian todos los recursos: ninguna aplicación pierde en el sentido de que deja la memoria asignada permanentemente después de que se cierra. XCode tiene una herramienta para ayudarlo a identificar fugas.
Mire en

Run->Run with performance Tool->Leaks
Eso ejecutará su aplicación equipada con código que lo ayudará a encontrar las fugas.

+0

Lo olvidé: también le dará una herramienta visual para observar lo que se ha filtrado y la pila de llamadas que conducen a la fuga. – garph0

+0

Mencioné que ya ejecuté Fugas y no ha encontrado un problema. Lo más probable es que la memoria esté asignada por un caché dentro de la aplicación, y ese caché se libera correctamente en la salida de la aplicación. Mi pregunta es ¿cómo puedo encontrar qué caché en particular está contabilizando toda la memoria para que pueda descargarla cuando cierro un documento? –

+0

Malo: no me di cuenta de que se refería a la herramienta de rendimiento Xcode Leaks. ¿Fue un detector de fuga visual o Mac Leaks? – garph0

4

Si puede reproducir esto de manera confiable, debería poder utilizar el montón de depuración en el MS CRT para solucionarlo. Comience aquí: Memory Leak Detection and Isolation

+0

Puedo intentarlo - No he intentado usar las rutinas de MS CRT durante algunos años, ya que solía ser el caso de que no se construyeran con nuestra base de código. Creo que fue algo así como el uso de 'ubicación nueva' que no le gustó. –

0

Puede ser útil para alguien. Pensé que Xcode 4.2 con detección de objetos zombie activada (una casilla de verificación en edición de esquema) come memoria como un loco - ~4GB en un min. Solo asegúrese de verificar esto en los casos en que su aplicación come memoria que se ejecuta bajo Xcode y no lo hace de otra manera. La asignación de memoria y las herramientas de fugas tampoco dan nada.

Cuestiones relacionadas