¿Cuál es la estadística correcta para la huella de memory de iOS? Live Bytes? Memoria real ¿Otro?

Definitivamente estoy confundido sobre este punto.

Tengo una aplicación para iPad que muestra el uso de 'Live Bytes' de 6 a 12 MB en el instrumento de asignación de objects. Si levanto el monitor de memory o el monitor de actividad, la columna 'Memoria real' siempre sube a alnetworkingedor de 80-90mb después de un uso serio.

Entonces, ¿tengo una huella de memory normal o alta?

Esta respuesta y esta respuesta afirman que debería ver 'Live Bytes' como la columna 'Memoria real' muestra los bloques de memory que se han lanzado, pero el sistema operativo todavía no lo ha recuperado.

Por otro lado, esta respuesta afirma que debe prestar atención a ese monitor de memory, ya que 'Live Bytes' no incluye elementos como los elementos de la interfaz.

¿Cuál es el acuerdo con la huella de memory de iOS? 🙂

Esas son simplemente dos métricas diferentes para medir el uso de la memory. Cuál es el "correcto" depende de qué pregunta estás tratando de responder.

En pocas palabras, la diferencia entre "bytes en vivo" y "memory real" es la diferencia entre la cantidad de memory utilizada actualmente para las cosas que su aplicación ha creado y la cantidad total de memory física actualmente atribuida a su aplicación. Hay al less dos razones por las que son diferentes:

  • código: el código de su aplicación debe cargarse en la memory, por supuesto, y el sistema de memory virtual seguramente lo atribuye a su aplicación, aunque no sea la memory asignada por su aplicación.

  • agrupaciones de memory: la mayoría de los asignadores trabajan manteniendo uno o más sets de memory desde los cuales pueden separar piezas para objects individuales o bloques de memory asignados. La mayoría de las implementaciones de malloc funcionan de esa manera, y espero que el asignador de objects también lo haga. Estas agrupaciones no se cambian de tamaño automáticamente hacia abajo cuando se desasigna un object: la memory solo se marca como "libre" en el grupo, pero todo el grupo se seguirá atribuyendo a su aplicación.

Puede haber otras forms en que la memory se atribuya a su aplicación sin que su código también lo asigne directamente.

Entonces, ¿qué estás tratando de aprender sobre tu aplicación? Si intentas descubrir por qué tu aplicación se bloqueó debido a la falta de memory, mira ambos "bytes en vivo" (para ver qué está usando ahora tu aplicación) y "memory real" (para ver cuánta memory dice el sistema VM aplicación está usando). Si intentas mejorar el performance de la memory de tu aplicación, es más probable que busques "bytes en vivo" o "objects en vivo", ya que esa es la memory de la que puedes hacer algo.

Al ver cómo escribí la última respuesta a la que te vinculaste, tendré que soportar eso. Si desea un recuento total y preciso del uso de memory actual para su aplicación, use el instrumento Memory Monitor.

Por razones que describo en esta respuesta , Asignaciones oculta los tamaños de memory de ciertos elementos, lo que significa que su total de uso de memory es significativamente más bajo que el tamaño de memory de la aplicación. Muchas personas descubren esto de la manera más difícil cuando intentan que su aplicación funcione en dispositivos iOS antiguos. En el hardware anterior, tenías un techo de memory dura de ~ 30 MB, donde si excedías tu aplicación era difícil de matar.

Muchos desarrolladores (incluido yo mismo) vieron que solo teníamos ~ 1-2 MB de bytes en vivo en Asignaciones y pensamos que estábamos bien, hasta que nuestras aplicaciones comenzaron a recibir advertencias de memory y terminaciones tempranas. Si miraba el Monitor de Memoria, podría ver que el tamaño real de la memory de estas aplicaciones era> 20 MB, y podría ver que las aplicaciones se terminan en el instante en que cruzaron la barrera de 30 MB en el Monitor de Memoria.

Por lo tanto, si desea una evaluación precisa del uso de memory de su aplicación total, use Memory Monitor. Las asignaciones son geniales para descubrir los objects específicos que están en la memory, especialmente cuando usa las tomas de stack para encontrar cosas que podrían acumularse (como fugas, ciclos de retención o por otros motivos). Simplemente no confíes en él al determinar el tamaño real de la aplicación en la memory.

'Live bytes' significa memory asignada por su código (por ejemplo, malloc ), por lo que tiene acceso a esta memory. 'Memoria real' muestra la cantidad física de memory utilizada por su aplicación. Esto incluye también las texturas OpenGL, (posiblemente) sonidos de Open AL …

Los bytes en vivo son útiles para verificar cuándo asigna y libera memory en su código. La memory real es un buen indicador de la eficiencia de la optimization de la memory. Y su sobrecarga provoca advertencias de "baja memory".