Instrumente und Haufenwachstum, wann ist Wachstum wirklich ein Leck?

9

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:

  1. Was deutet diese Art von Verhalten an? Habe ich Speicherprobleme? Gibt es irgendwo eine Art fauler Speicherfreigabe?
  2. In einem Meer von Iterationen, die persistenten Speicher zeigen, was bedeutet eine Null-Heap-Wachstum-Iteration?
  3. Wenn der Stack-Trace für eine bestimmte Generation nur auf Systembibliotheken verweist, bedeutet das, dass das Heap-Wachstum für diese Generation gültig ist oder dass ein Bug vorliegt? Oder könnte es immer noch bedeuten, dass etwas an der Erinnerung an meinem Ende festhält?
  4. Was bedeutet es, wenn der Stack-Trace Ihre Bibliothek und Methode anzeigt, aber ausgegraut wie der Systemcode und ein kleines Haussymbol hat, gegenüber einer Linie mit Ihrer Bibliothek und Methode, die in schwarz ist und eine kleine Person hat Symbol?
  5. Wenn ich etwas wie einen Retain-Zyklus habe - wäre das anhaltende Wachstum nicht konsistent?

Jede Antwort auf Einsichten wäre sehr hilfreich!

    
dragonflyesque 16.10.2014, 22:06
quelle

1 Antwort

1

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.

    
ipmcc 31.01.2015 17:20
quelle