2011-11-29 12 views
6

Tengo un problema de memoria extraño Tengo problemas para resolver y agradecería algunos consejos sobre dónde buscar más.Advertencias y bloqueos de la memoria del iPhone - pero los instrumentos que muestran poca memoria usan

El programa que tengo (aplicación de iPhone) tiene una función que básicamente descarga cargas de archivos, procesa los que son JSON y almacena el resto en el disco. El procesamiento JSON requiere una gran cantidad de CPU y puede tomar varios segundos por archivo, por lo que tengo NSOperationQueue con maxConcurrency limitado a 1 que maneja todo el trabajo pesado y una cola que administra los múltiples archivos para descargar.

Desde que salió iOS5, la aplicación ha tenido problemas para completar la secuencia de descarga sin fallar y, hasta ahora, lo que he intentado es;

1) Se modificó el proceso performSelectorOnBackgroundThread JSON para usar un solo NSOperationQueue a fin de limitar el número de subprocesos de fondo que funcionan con objetos grandes.

2) Se agregaron NSAutoReleasePools dentro de los bucles que crean objetos múltiples, grandes y transitorios.

3) Lave laURLCache compartida para garantizar que los archivos no se queden en la memoria caché del sistema.

4) Almacena los objetos JSON en el disco utilizando NSKeyedArchiver y pasa los nombres de los archivos entre hilos en lugar de los objetos reales, para intentar de nuevo mitigar el número y el tamaño de los objetos retenidos actualmente en uso.

Al principio todos parecían marcar la diferencia, y cuando miro las asignaciones de memoria, ahora tengo el uso máximo de más de 20 MB (por lo tanto no es de extrañar que fallara) a menos de 10 MB, y sin embargo, la aplicación sigue fallando con poca memoria como antes.

Estoy tratando de rastrear lo que se está comiendo el recuerdo que causa la falla de la aplicación y en esta ocasión estoy teniendo problemas para persuadir a los instrumentos para que me digan algo útil.

Aquí un rastro típico (en un iPhone 3GS con iOS 4.3.5)

enter image description here

se puede ver que el uso máximo era un poco más de 7 MB y, sin embargo, poco después, se puede ver la 2 banderas pertenecientes a poca memoria, y luego poca memoria urgente, seguidas por la aplicación que termina poco después.

Si utilizo el monitor de memoria, la causa del bloqueo parece ser lo suficientemente clara - se está agotando la memoria física - observe el siguiente trazo verde claro. Las advertencias de memoria baja coinciden (no sorprendentemente) con la memoria física se está agotando.

enter image description here

no hay fugas que muestran Fwiw bien (lo he hecho en otras carreras).

No se trata de cachés de imágenes o cachés de NSURLConnection y lo único que se me ocurre es que quizás haya algunas filtraciones defectuosas que no se detectan ... pero tengo problemas para identificarlas porque si hago clic en todas asignaciones para ver los objetos que están en vivo, y luego hacer un comando-A para seleccionarlos todos (para pegarlos en una hoja de cálculo para ver dónde parece estar la memoria), en el punto que pulso el comando-C para copiarlos , Instrumentos beachballs y nunca se recupera.

Realmente no puedo entender lo que está pasando.¿Alguien tiene algún consejo sobre cómo persuadir a los instrumentos para que me muestren información más útil sobre lo que está usando esta memoria?

Lo siento, no puedo publicar ningún fragmento de código significativo ... espero que las capturas de pantalla de los instrumentos al menos te den una idea de dónde vengo.

+0

¿Dijiste que tus problemas comenzaron con iOS 5, pero tu rastro está en 4.3? (¡Y tiene problemas!) –

+0

Sí, el problema se descubrió por primera vez con iOS5, y al principio parecía limitado a dispositivos iOS5, pero actualmente, durante las pruebas, parece estar fallando en otros sistemas también. Creo que ahora lo estamos viendo más de cerca, por lo que la versión de iOS puede o no ser relevante. – Roger

Respuesta

6

El instrumento Leaks no es terriblemente útil para descubrir nada más que las fugas obvias en su aplicación.

Lo que está describiendo es un candidato ideal para el análisis de diapositivas.

tl; dr Heapshot analysis le permite ver exactamente cómo crece el montón de su aplicación entre dos puntos de tiempo (donde determina los puntos).

+0

Gracias, encontré tu blog de fotos hace una semana o así y me pareció más útil (+1). Hice algunos análisis y no vi nada adverso, pero volveré a revisarlo por la mañana y volveré a mirar, ya que quizás me estaba perdiendo lo que podría haber estado diciéndome. – Roger

Cuestiones relacionadas