35 votes

Comprendre la consommation de mémoire sur iPhone

Je suis en train de travailler sur un 2D jeu iPhone en utilisant OpenGL ES et je continue à frapper le 24 MO de mémoire limite de mon application crash avec le code d'erreur 101. J'ai essayé très fort pour trouver l'emplacement de la mémoire, mais les chiffres dans les Instruments sont toujours beaucoup plus grand que ce à quoi je m'attends.

J'ai couru à la demande avec la Mémoire du Moniteur, de l'Objet Alloc, les Fuites et OpenGL ES instruments. Lorsque l'application est chargée, de mémoire physique libre gouttes de 37 MO à 23 MO, l'Objet Alloc s'installe autour de 7 MO, les Fuites de montrer deux ou trois fuites de quelques octets la taille, le Gart Objet d'une Taille d'environ 5 MO et la Mémoire du Moniteur dit que l'application prend environ 14 MO de mémoire réelle. Je suis perplexe car d'où vient le mémoire aller – quand je creuse dans les Allocations d'Objets, la plupart de la mémoire est dans les textures, exactement comme je m'attends. Mais à la fois mon propre texture, l'allocation de compteur et le Gart Taille de l'Objet acceptez que les textures devraient prendre quelque part autour de 5 MO.

Je ne suis pas au courant de l'attribution de toute autre chose qui serait utile de mentionner, et l'Objet Alloc est d'accord. Lorsque la mémoire est-elle aller? (Je serais heureux de vous fournir plus de détails si ce n'est pas assez.)


Mise à jour: j'ai vraiment essayé de trouver où je pourrais allouer une grande quantité de mémoire, mais sans résultats. Ce qui me motive le sauvage est la différence entre les Allocations d'Objets (~7 MO) et le réel de l'utilisation de la mémoire, comme illustré par la Mémoire du Moniteur (~14 MO). Même si il y avait d'énormes fuites ou d'énormes morceaux de mémoire, je l'oublie, l' devraient toujours apparaître dans les Allocations d'Objets, ne devraient-ils pas?

J'ai déjà essayé les habituels suspects, c'est à dire. l' UIImage avec son cache, mais cela n'a pas aidé. Est-il un moyen de suivre l'utilisation de la mémoire "débogueur" de style, ligne par ligne, regarder chaque énoncé de l'impact sur l'utilisation de la mémoire?


Ce que j'ai trouvé jusqu'à présent:

  1. Vraiment, je suis en utilisant beaucoup de mémoire. Il n'est pas facile de mesurer la réelle consommation de mémoire, mais après beaucoup de comptage, je pense que la consommation de mémoire est vraiment élevé. De ma faute.

  2. Je n'ai pas trouvé de moyen facile de mesurer la quantité de mémoire utilisée. La Mémoire de Surveiller les chiffres sont exacts (ce sont les chiffres qui comptent vraiment), mais la Mémoire du Moniteur ne peux pas vous dire exactement où la mémoire s'en va. L'Objet Alloc outil est presque inutile pour le suivi de la réelle utilisation de la mémoire. Lorsque je créer une texture, la mémoire allouée compteur va pendant un certain temps (la lecture de la texture dans la mémoire), puis descend (en passant les données de la texture OpenGL, libérer). C'est OK, mais ne se produit pas toujours – parfois l'utilisation de la mémoire reste élevé, même après que la texture a été transmis à OpenGL et libéré de "ma" mémoire. Cela signifie que le total de la quantité de mémoire allouée, comme indiqué par l'Objet Alloc outil est plus petit que le total réel de la consommation de mémoire, mais plus grand que la consommation réelle, moins de textures (real – textures < object alloc < real). Aller à la figure.

  3. J'ai mal lu le Guide de Programmation. La limite de mémoire 24 MO s'applique aux textures et les surfaces, et non pas l'ensemble de l'application. La véritable ligne rouge se trouve un peu plus loin, mais je n'ai pas trouvé de chiffres. Le consensus est que de 25 à 30 MO est le plafond.

  4. Lorsque le système est à court de mémoire, il commence l'envoi de l'avertissement de mémoire. Je n'ai presque rien de gratuit, mais que d'autres applications ne libérer la mémoire vers le système, en particulier Safari (ce qui semble être la mise en cache des sites web). Lorsque la mémoire libre, comme indiqué dans la Mémoire du Moniteur va de zéro, le système commence à les tuer.

J'ai dû mordre la balle et de réécrire certaines parties du code pour être plus efficace sur la mémoire, mais je suis probablement encore en le poussant. J'

11voto

bentford Points 9981

Je doute fortement de ce bogue dans les Instruments.

Tout d'abord, lisez ce post de blog de Jeff Lamarche sur openGL textures:

  • a un exemple simple de comment charger les textures sans provoquer de fuites
  • donne la compréhension de la façon dont les "petits" images, obtenir une fois qu'ils sont chargés en openGL, en fait utiliser "beaucoup" de mémoire

Extrait:

Les Textures, même s'ils sont fabriqués à partir de des images compressées, utiliser beaucoup de votre application du segment de mémoire parce qu'ils doivent être élargi dans la mémoire utilisé. Chaque pixel occupe quatre octets, donc oublier de libérer la texture de vos cheveux les données d'image peuvent vraiment manger vos la mémoire rapidement.

Deuxièmement, il est possible de déboguer mémoire de texture avec des Instruments. Il y a deux profilage configurations: OpenGL ES de l'Analyseur et OpenGL ES Pilote. Vous devez exécuter ces sur l'appareil, comme le simulateur de ne pas utiliser OpenGL. Choisissez simplement le Produit->Profil de XCode et regarder pour ces profils, une fois les Instruments de lance.


Armés de cette connaissance, voici ce que je ferais:

  • Vérifiez que vous n'êtes pas de fuite de mémoire -- cela va évidemment provoquer ce problème.
  • Assurer votre'e pas accès à autoreleased mémoire -- cause fréquente d'accidents.
  • Créer une application de test et de jouer avec le chargement des textures individuellement et en combinaison) pour savoir ce que la texture (ou une combinaison de ceux-ci) est à l'origine du problème.

Mise à JOUR: Après avoir réfléchi à votre question, j'ai lu d'Apple OpenGL ES Guide de Programmation et il a de très bonnes informations. Hautement recommandé!

3voto

Genericrich Points 3538

Une solution consiste à commenter le code et à vérifier si le bogue persiste. Oui, c'est fastidieux et élémentaire, mais cela pourrait aider si vous saviez où se trouvait le bogue.

La raison pour laquelle il s’écroule, c’est pourquoi

2voto

CarmeloS Points 1517

Pour ceux qui verront la fin de l'année 2012:

La mémoire très chargé en physique de l'unité de mémoire est la Mémoire Résidente en VM Tracker Instrument.

Instrument d'Allocation seulement les marques de la mémoire créé par malloc/[NSObject alloc] et certains cadres de la mémoire tampon, par exemple, décompressé l'image bitmap n'est pas inclus dans la Répartition de l'Instrument, mais il prend toujours plus de votre mémoire.

S'il vous plaît Regarder la WWDC 2012 Session 242 de l'Application iOS de la Performance: de Mémoire pour obtenir l'information à partir d'Apple.

0voto

Eric Albert Points 238

Cela ne vous aide pas spécifiquement, mais si vous constatez que les outils de mémoire ne fournissent pas toutes les données dont vous avez besoin, veuillez enregistrer un bogue à l'adresse bugreport.apple.com. Joignez une copie de votre application et une description de la façon dont les outils sont en deçà de votre analyse. Apple verra s'ils peuvent améliorer les outils. Merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X