Qu’est-ce que l’iOS jetsam, et comment fonctionne-t-il exactement ?


Jetsam surveille l'utilisation de la mémoire et tue les applications qui ne sont pas de bons citoyens de la mémoire. Un bon citoyen de la mémoire est une application qui est prête à rendre de la mémoire quand on le lui demande et qui ne demande pas sans cesse plus de mémoire.

Pour être un bon citoyen de la mémoire et ne pas être tué par Jetsam, une application doit utiliser les techniques suivantes :

  • Lazy initializers sur tous les objets qui peuvent nécessiter une mémoire substantielle et qui peuvent être facilement recréés.
  • NSCache combiné avec NSPurgeableData pour toutes les grandes ressources de mémoire qui proviennent d'une source externe et dont la recréation nécessite des cycles CPU substantiels. Ceci est particulièrement utile pour des choses comme les images d'avatars traitées chargées depuis le web ou une base de données. Par exemple, si vous avez des cellules CollectionView qui utilisent des images individuelles pour chaque cellule et que ces images ont quelque chose comme un masque circulaire, vous pouvez mettre l'image en cache pour la réutiliser et vider le cache lorsque la mémoire est nécessaire. Cela accélérera les performances de votre app et lui permettra d'être un bon citoyen en retournant la mémoire lorsqu'elle est demandée.
  • Streaming des données de fichiers qui doivent être traitées plutôt que de charger toutes les données en mémoire. Si l'app a besoin de traiter un grand fichier pour extraire des informations, en utilisant l'accès mappé de mémoire au fichier peut considérablement réduire l'empreinte mémoire et garder votre ballonnement qui déclencherait Jetsam.
  • Dans le ViewController's viewDidDisappear, nil out toutes les ressources qui peuvent être facilement recréées dans viewWillAppear. Ceci est important pour minimiser votre empreinte en arrière-plan si votre application fonctionne en arrière-plan. Il en va de même pour la méthode AppDelegate applicationDidEnterBackground:
  • Surveiller la méthode ApplicationDelegate applicationDidReceiveMemoryWarning :, et la méthode ViewController didReceiveMemoryWarning afin de libérer les ressources recréables décrites ci-dessus.
  • Utilisez l'outil profile Allocations avec le comptage de référence activé pour vérifier que vous n'avez pas'de cycles de référence qui empêchent la libération des ressources.
  • En mode test/débogage, vous pouvez demander à votre app d'appeler les méthodes memoryWarning elle-même et voir si la mémoire est libérée.

Une note importante sur Jetsam, il semble être très important qu'une app soit prête à abandonner un peu de mémoire. Ceci est aussi important, sinon plus, que la quantité absolue de mémoire utilisée. Ainsi, que votre app utilise 50MB ou 150MB, elle doit être capable de rendre un peu de mémoire lorsqu'on le lui demande afin d'éviter d'être tuée par Jetsam.

Voici une très bonne vidéo donnée par Conrad Kramer sur Jetsam et comment rester en vie.

100%.