ios - una - ¿Por qué recibo avisos de memoria con solo 7 MB de memoria asignada?
netflix consume datos en movistar (2)
Estoy ejecutando mi aplicación iOS en un dispositivo iPod touch y recibo advertencias de memoria incluso si el pico de asignación total es de solo 7 MB, como se muestra a continuación (esto sucede cuando se presiona la escena del juego):
Lo que me parece extraño es que:
el pico izquierdo (en el momento 0.00) corresponde a 20 MB de memoria asignada (escena de introducción) y, a pesar de esto, NO da ninguna advertencia de memoria.
el pico central (en el momento 35.00) corresponde a aproximadamente 7 MB de memoria asignada (se está presionando la escena del juego) y da una advertencia de memoria.
No entiendo por qué recibo esas advertencias si la memoria total es de solo 7 MB. ¿Esto es normal? ¿Cómo puedo evitar esto?
Si observamos la densidad de asignación, podemos ver el siguiente esquema, que (para mí) no muestra mucha diferencia entre el momento en que se está presionando la escena de introducción (0.00) y el momento en que se está presionando la escena de juego (35.00). Como los picos de densidad son similares, supongo que las advertencias de memoria se deben a otra cosa que no puedo detectar .
EDITAR:
He seguido una sugerencia de usar "Monitor de actividad" en su lugar, pero desafortunadamente mi aplicación se bloquea al cargar la escena del juego con solo 30 MB de memoria asignada . Aquí está el informe del monitor de actividad.
En cuanto al informe, puedo ver una suma total del uso de memoria real de aproximadamente 105 MB. Dado que esto debería referirse a la memoria RAM y dado que mi modelo debería tener 256 MB de RAM, esto no debería causar fallas en la aplicación o problemas de pérdida de memoria.
Ejecuto el monitor de fugas y no muestra ninguna fuga en mi aplicación. También maté a todas las otras aplicaciones.
Sin embargo, al analizar el informe, veo un sorprendente valor de 167 MB de memoria virtual asociado a mi aplicación. ¿Esto es normal? ¿Qué significa ese valor? ¿Puede ser esta la razón del accidente? ¿Cómo puedo detectar qué áreas de mi código son responsables de esto?
Mi iPod es un modelo de cuarta generación con 6,4 GB de capacidad (memoria) y solo 290 MB de memoria libre. No estoy seguro de si esto de alguna manera afecta el rendimiento de la paging memoria paging .
EDIT 2: También he buscado más en SpringBoard y su uso de memoria virtual es de 180 MB. ¿Esto es normal? Encontré algunas questions/answers que parecen sugerir que SpringBoard es responsable de la liberación automática de objetos (debería ser el proceso de administración de la pantalla y el botón de inicio, pero no estoy seguro de que tenga que ver con la administración de memoria). ¿Es esto correcto?
Otra nota. Estoy usando ARC. Sin embargo, no estoy seguro de que esto tenga mucho que ver con el problema, ya que no hay fugas de memoria aparentes y XCode debería convertir el código agregando las llamadas de liberación / desasignación / retención al binario compilado.
EDIT 3: Como he dicho antes, estoy usando ARC y Cocos2d (2.0). He estado jugando con el monitor de actividad. Descubrí que si quito el mecanismo de autenticación de GameCenter, entonces el Monitor de actividad funciona bien ( nueva duda: ¿alguien más tuvo un problema similar? ¿Se está conservando la vista de autenticación de GameCenter en algún lugar? ). Sin embargo, me di cuenta de que cada vez que navego hacia atrás y hacia adelante entre las distintas escenas anteriores a GameScene (Escena inicial -> Selección de personajes -> Selección de planetas -> Selección de personajes -> Selección de planetas -> etc. -> Selección de personajes ..) Aumenta el uso de la memoria real . Después de un tiempo, empiezo a recibir advertencias de memoria y la aplicación muere en iOS. Ahora la pregunta es:
-> ¿Estoy reemplazando las escenas de la manera correcta? Llamo a lo siguiente desde la varia escena:
[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];
Tengo Cocos2d 2.0 como biblioteca estática y el código de replaceScene es este:
-(void) replaceScene: (CCScene*) scene
{
NSAssert( scene != nil, @"Argument must be non-nil");
NSUInteger index = [scenesStack_ count];
sendCleanupToScene_ = YES;
[scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
nextScene_ = scene; // nextScene_ is a weak ref
}
Me pregunto si de alguna manera la escena no se desasigna adecuadamente. Verifiqué que se está llamando al método de limpieza, sin embargo, también agregué una llamada CCLOG al método dealloc CCLayer y reconstruí la biblioteca estática. El resultado es que el método dealloc no parece ser llamado .
¿Esto es normal? :RE
Encontré que otras personas tenían problemas similares . Me pregunto si tiene que ver con retener los ciclos y los autobloqueos. Realmente necesito pasar un tiempo estudiando esto a menos que, desde EDIT 3, alguien pueda decirme ya lo que estoy haciendo mal :-)
Resolví esto agregando una impresión del uso efectivo de memoria del proceso en la consola. De esta manera, podría obtener una medición precisa de la memoria real utilizada por el proceso de la aplicación. El uso de instrumentos resultó impreciso ya que la memoria real utilizada no coincidía con la que se muestra en los instrumentos.
Este código se puede utilizar para obtener el uso efectivo de la memoria:
-(vm_size_t)report_memory
{
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
return info.resident_size;
}
Toda la capacidad de memoria compartida a través de todas las aplicaciones y procesos se ejecuta en iOS. Por lo tanto, otras aplicaciones pueden usar una gran cantidad de memoria y su aplicación también recibirá una advertencia de memoria. Recibirás advertencias de memoria hasta que no sea suficiente.
Para comprender lo que realmente sucede con la memoria en tu aplicación, debes
Cree un perfil de su aplicación con Fugas (ARC no garantiza que no tenga fugas, es decir, un problema de autocaptura).
Utilice el análisis de heapshot (descrito brevemente aquí http://bentrengrove.com/blog/2013/4/26/heapshot-analysis )
Y revisa esta publicación sobre memoria y memoria virtual en iOS: http://liam.flookes.com/wp/2012/05/03/finding-ios-memory/