Ich benutze Instrumente auf einem Gerät, um herauszufinden, ob ich Speicherleckage oder -verlust habe. Insbesondere verwende ich Lecks und Zuordnungen. Während Instrumente keine Lecks aufzeigen, bedeutet das nicht, dass ich keine Speicherprobleme habe. Ich arbeite seit Wochen daran, und ich bin anscheinend nicht näher dran, herauszufinden, welche Probleme ich habe (äh).
Ich teste eine bestimmte Aktion, indem ich nach der Aktion einen Heapshot mache und wiederhole. Nach den ersten "sesshaften" Generationen kann ich sehen, dass das Wachstum und die persistente Zählung alle bei einer bestimmten Anzahl beginnen (einige kb). Nach vielen wiederholten Iterationen (sagen wir 10-20), enden einige (nicht alle) langsam auf 0. Es dauert eine Weile, aber es passiert. Die Generationen, in denen persistenter Speicher vorhanden ist, zeigen mir nie wirklich etwas, das ich hilfreich finde, da der Stack-Trace alle Systembibliotheken anzeigt.
Meine Fragen sind also:
Jede Antwort auf Einsichten wäre sehr hilfreich!
Ich werde einen Stich in Ihre Fragen machen:
Was deutet diese Art von Verhalten an? Habe ich Speicherprobleme? Ist Gibt es irgendwo eine Art fauler Speicherfreigabe?
Da Sie nicht wissen können, wie die Systemframeworks ihren privaten Speicherbedarf verwalten, müssen Sie davon ausgehen, dass es bei jedem Aufruf der Systemframeworks, die in den meisten Apps verfügbar sind, eine verzögerte Freigabe von Speicher geben kann. die ganze Zeit". Abgesehen davon, dass ich es nicht ausschließen kann, kann ich mit einiger Sicherheit sagen, dass es auf jeden Fall langlebige Zuordnungen gibt, die durch scheinbar harmlose System-Framework-Nutzung ausgelöst werden. (Siehe die Diskussion über den langlebigen Speicher von UIWebView in diese Antwort für ein Beispiel.)
In einem Meer von Iterationen, die persistenten Speicher zeigen, was macht ein Null-Heap-Wachstum Iteration bedeuten?
Schwer zu sagen. Eine gute Schätzung erster Ordnung könnte sein, dass das Heap-Wachstum, das mit der Iteration verbunden ist, irgendwie genau durch eine Lazy / Deferred-Freigabe des für eine vorherige Iteration reservierten Speichers ausgeglichen wurde.
Wenn der Stack-Trace für eine bestimmte Generation zeigt nur für Systembibliotheken, bedeutet dies das Haufenwachstum dafür Generation ist gültig oder gibt es einen Fehler? Oder könnte es immer noch bedeuten? dass etwas an der Erinnerung an meinem Ende festhält?
Wenn Instrumente Heap-Wachstum anzeigen, dann ist dieses Heap-Wachstum fast sicher vorhanden. Ob das Haufenwachstum etwas ist, von dem Sie direkte Kontrolle haben, hängt davon ab. Wenn Sie keine Systemframeworks aufrufen (nicht wahrscheinlich), ist es definitiv Ihre Schuld. Sobald Sie die Systemframeworks aufrufen, müssen Sie die Möglichkeit akzeptieren, dass das Framework Speicher reserviert, der nach der Rückkehr Ihres Calls reserviert bleibt.
Was macht Es bedeutet, wenn der Stack-Trace Ihre Bibliothek und Methode zeigt, aber es ist ausgegraut wie der Systemcode und hat ein kleines Haussymbol, gegen eine a Linie mit Ihrer Bibliothek und Methode, die in schwarz ist und ein wenig hat Personensymbol?
Linien, die ausgegraut sind, zeigen an, dass Instrumente keine Debug-Symbole für diese Linie haben. Das ist alles. Es zeigt nichts Spezifisches bezüglich der Speicherbenutzung an.
Wenn ich etwas wie einen Retain-Zyklus habe - wäre das nicht anhaltendes Wachstum konsequent sein?
Wenn jede Iteration ein neues Objektdiagramm mit zyklischen Beibehalten erstellt hat, dann würden Sie erwarten, dass jede Iteration zu einem Heap-Wachstum von mindestens der Größe dieses Objektdiagramms führen würde. Das heißt, kleine Objektgraphen können leicht im "Rauschen" verloren gehen. Wenn Sie einen Verdacht haben, besteht eine Möglichkeit darin, dass Objekte einer "verdächtigen" Klasse eine riesige Zuweisung durchführen, die sie von dem "Rauschen" abhebt. Zum Beispiel, machen Sie Ihr Objekt malloc
ein Megabyte (oder mehr) für jede Instanz (und natürlich frei, wenn die Instanz freigegeben ist.) Dies kann dazu beitragen, dass Problembereiche herausragen, wo sie ursprünglich nicht haben.
Tags und Links objective-c ios instruments automatic-ref-counting