he estado jugando un poco con diferentes compilaciones de mi aplicación y parece que suceden cosas extrañas:cocoa ¿Los binarios de 64 bits pierden memoria? (liberar NSData no libera la memoria)
mi aplicación tiene una huella de inactividad de 5mb. al cargar una memoria de archivo en el tamaño del archivo está reservado. después de la carga, la memoria reservada debe liberarse. ahora hay diferencias en las construcciones (gc = recolector de basura):
- 32bit i386 no-GC: toda la memoria se libera al instante.
- 32bit i386 GC: casi toda la memoria se libera al instante. el resto un tiempo después.
- 64bit x86_64 no-GC: la memoria mínima se libera. como 10%
- 64bit x86_64 GC: no se libera ninguna memoria. la memoria permanece reservada durante horas. (actividad mon)
uso LLVM con CLANG. He estado corriendo instrumentos hoy todo el tiempo y estaba buscando fugas/zombies/etc. y todo parece estar limpio. (la aplicación es bastante simple.)
¿Hay una explicación para este comportamiento?
Actualización:
Eso es un poco de materia extraña. He hervido el problema con esto:
Cargué un archivo de 20 mb en un NSData y lo liberé. Estoy haciendo esto sin ninguna recolección de basura habilitada. El código es:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
Cuando construyo para i386 32 bits, los 20mb se asignan y liberan. Cuando cambio la compilación a 64bit x86_64, la versión no hace nada. La estancia de 20 mb asignada.
upper pic 32bit lower 64 http://kttns.org/zguxn
No hay diferencia entre las dos aplicaciones, excepto que el superior está construida de 32 bits y el inferior de 64 bits. No hay GC funcionando. (Con GC activado aparece el mismo problema.)
Actualización 2:
El mismo comportamiento se observa cuando se crea una nueva aplicación de cacao desde cero con sólo el código superior en applicationDidFinishLaunching :. En el modo de 64 bits, la memoria no se libera. i386 funciona como se esperaba.
El mismo problema aparece con NSString en lugar de NSData. También aparece cuando reinicio el kernel de 64 bits. (64 Sosteniendo al inicio.)
OS 10.6.0 es
¿Ha intentado asignar y desasignar muchas instancias de NSData para ver si la memoria porque alguno de ellos es reclamado? Es posible que el programa no devuelva la memoria al sistema operativo a menos que haya una escasez de memoria. – Amok
Acabo de intentar reproducir esto en 10.6 sin suerte. ¿Ha archivado un error con su aplicación de prueba? – Ken
Su aplicación se comporta correctamente y no tiene pérdidas de memoria. Vea mi respuesta a continuación para una explicación semi detallada. – bbum