web-dev-qa-db-fra.com

Crash de mémoire faible iOS, mais très faible utilisation de la mémoire

Cela m'ennuie depuis longtemps. Mon application utilise environ 2,74 Mo de mémoire. C'est très bien. Mais quand il crée une UIWebView, il monte à environ 5,87 Mo et se bloque. Ce sont les valeurs données sous Live Bytes in Instruments lors de l'exécution sur mon iPad de 1ère génération.

Il n'y a aucun journal de plantage que je puisse trouver. Les éléments suivants proviennent de la console:

MyApp[1205] <Warning>: Received memory warning. Level=1
MyApp[1205] <Warning>: applicationDidReceiveMemoryWarning
SpringBoard[30] <Warning>: Received memory warning. Level=1
MobileMail[1199] <Warning>: Received memory warning. Level=1
configd[26] <Notice>: jetsam: kernel memory event (95), free: 428, active: 1853, inactive: 1011, purgeable: 338, wired: 15122
configd[26] <Notice>: jetsam: kernel termination snapshot being created
com.Apple.launchd[1] <Notice>: (UIKitApplication:com.Apple.mobilemail[0x8966]) Exited: Killed: 9
com.Apple.launchd[1] <Notice>: (UIKitApplication:com.MyApp.MyApp[0xdd4f]) Exited: Killed: 9
SpringBoard[30] <Warning>: Application 'Mail' exited abnormally with signal 9: Killed: 9
kernel[0] <Debug>: launchd[1207] Builtin profile: MobileMail (sandbox)
SpringBoard[30] <Warning>: Application 'MyApp' exited abnormally with signal 9: Killed: 9
configd[26] <Debug>: CaptiveNetworkSupport:UIAllowedNotifyCallback:70 uiallowed: false
ReportCrash[1206] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
ReportCrash[1206] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
ReportCrash[1206] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2011-05-12-160645.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0

J'ai supprimé tous les appels à imageNamed, changé les trucs publiés automatiquement en alloc/release. Mais je ne peux pas comprendre pourquoi cela se produit et cela me rend fou.

Merci pour toute aide!

35
Max

Vous utilisez presque certainement beaucoup plus de mémoire que vous ne le pensez.

Ce que vous devez faire pour voir ce que votre application utilise réellement n'est pas évident, mais une fois que vous l'avez fait plusieurs fois, vous vous en souviendrez.

  1. Exécutez avec l'outil de performance Allocations.
  2. Cliquez sur la ligne VM Tracker "sous" Allocations "(dans la capture d'écran)
  3. Cliquez sur "Instantané automatiquement"

Ensuite, vous verrez votre mémoire sale (actuellement 20,34 Mo sur ma capture d'écran).

Cela devrait vous donner une bien meilleure idée des raisons pour lesquelles votre application se ferme. Vous avez probablement de grandes fuites.

bonne chance!

This screenshot will help

51
Paul Bruneau

J'ai deux choses à ajouter qui peuvent aider:

  1. Comme mentionné dans un précédent réponse , le bitmat d'un UIImage n'est pas pris en compte dans la quantité de fuites de mémoire vous indique que votre application utilise! de sorte que vous pouvez avoir beaucoup de UIImages qui utilisent beaucoup de mémoire, ne figurant pas dans le total. Ma recommandation est d'utiliser les allocations pour vérifier le nombre d'objets UIImage créés et détruits pendant l'exécution de votre application.
  2. Comme mentionné dans cette réponse utilisez le code suivant

    -(void) 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 ) {
            NSLog(@"Memory in use (in bytes): %u", info.resident_size);
        } else {
            NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
        }
    }
    

pour voir la quantité de mémoire que le système d'exploitation a attribuée à votre application. C'est un nombre plus précis sur la mémoire que votre application utilise. (Vous devrez #importer "mach/mach.h")

à votre santé!

22
fsaint