iPhone OS Speicherwarnungen. Was bedeuten die verschiedenen Ebenen?

85

In Bezug auf die schwarze Kunst der Speicherverwaltung auf iPhone OS-Geräten: Was bedeuten die verschiedenen Ebenen der Speicherwarnung? Level 1? Level 2? Geht das Zifferblatt auf 11?

Kontext: Nach einer langen Testphase mit Speicherstress - einschließlich der Ausführung meiner iPad-App mit der iPod Music Player-App - neige ich dazu, die zufälligen, aber seltenen Speicherwarnungen zu ignorieren, die ich erhalte. Meine App stürzt nie ab. Je. Meine App ist leckfrei. Und nun, die Mems-Warnungen scheinen einfach keine Rolle zu spielen.

Danke,
Doug

Dugla
quelle

Antworten:

98

Grundsätzlich bedeuten die Warnungen, dass dem Gerät der Arbeitsspeicher ausgeht und dass "Wenn Sie bitte etwas Speicher freigeben könnten, den Sie nicht aktiv nutzen, wäre das sehr gut ! ". Wenn Ihre Speicherverwaltung eng ist und Sie keine Objekte haben, die praktisch verworfen werden könnten, geben Sie die Nachricht einfach weiter und ignorieren Sie sie.

Williham Totland
quelle
25
LOL "Wenn Sie bitte etwas Speicher freigeben könnten, den Sie nicht aktiv nutzen, wäre das sehr gut!" Unbezahlbar ;-) Prost
dugla
15
Du klingst wie ein verärgerter Veteran des iPhone OS Wack-a-Mole Memory Dance.
Dugla
193

Warnungen auf Speicherebene werden von SpringBoard protokolliert. Als App-Entwickler müssen Sie sich nicht darum kümmern. Nur zu antworten -{application}didReceiveMemoryWarningist genug.


Es gibt 4 Warnstufen (0 bis 3). Diese werden vom Kernel Memory Watcher festgelegt und können von der nicht so öffentlichen FunktionOSMemoryNotificationCurrentLevel() abgerufen werden .

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

Wie die Level ausgelöst werden, ist nicht dokumentiert. SpringBoard ist so konfiguriert, dass in jeder Speicherebene Folgendes ausgeführt wird:

  1. Warnung (nicht normal) - Neustart oder Verzögerung des automatischen Neustarts nicht notwendiger Hintergrund-Apps, z. B. Mail.
  2. Dringend - Beenden Sie alle Hintergrund-Apps, z. B. Safari und iPod.
  3. Kritisch und darüber hinaus - Der Kernel wird die Kontrolle übernehmen und wahrscheinlich SpringBoard beenden oder sogar neu starten.

Das Töten der aktiven App (Jetsam) wird aber nicht von SpringBoard übernommen launchd.

kennytm
quelle
Danke dafür. Es war ein Streit zwischen Ihnen und Williham, dem Komiker, in dieser Frage. Humor gewinnt. Prost.
Dugla
Hallo, ich habe das gleiche Problem. Nachdem ich die Anwendung mehr als fünf Mal ununterbrochen ausgeführt habe, wird eine Warnung zum Empfangsspeicher angezeigt. Level = 1 für 20 Mal, aber die Anwendung stürzt nicht ab. Aber wenn ich diese Nachricht erhalte, wurde eine Speicherwarnung empfangen. Level = 2 Meine Anwendung stürzt ab. Level2 wird angezeigt, nachdem Level1 fast 20 Mal angezeigt wurde. Wie kann ich dafür sorgen, dass meine Anwendung nicht abstürzt? Vielen Dank
Srikanth Rongali
1
@Kenny: Weniger Speicher bedeutet, wie viel können wir maximal verwenden. Wie viel können wir lebende Bytes haben? In meinem Absturzprotokoll habe ich das bekommen. Freie Seiten: 371 Kabelgebundene Seiten: 12192 Löschbare Seiten: 0 Größter Prozess: DTMobileIS Was bedeutet das? Wo soll ich aufpassen? Danke.
Srikanth Rongali
9
@srik: Du solltest besser eine neue Frage stellen .
Kennytm
@kennytm: ist das mit ios8 noch möglich? Ich habe gesehen, dass die Funktion in definiert ist libsystem_c.dylib. Es wäre großartig, wenn ich es benutzen könnte. Danke
focs
12

Aus OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

Insgesamt 5 Ebenen der Speicherwarnung (-1,3).

In Bezug auf die Beschreibung der Warnung zur Speicherebene ist die Antwort von @ KennyTM ausgezeichnet.

Ich möchte einige verwandte Punkte hinzufügen, die PM und anderen helfen können.


Was sollten Sie tun, wenn Sie eine Warnung zur Speicherebene haben?

Nach Erhalt einer dieser Warnungen sollte Ihre Handler-Methode sofort nicht mehr benötigten Speicher freigeben. Das Standardverhalten der UIViewController-Klasse besteht beispielsweise darin, ihre Ansicht zu löschen, wenn diese Ansicht derzeit nicht sichtbar ist. Unterklassen können das Standardverhalten ergänzen, indem zusätzliche Datenstrukturen gelöscht werden. Eine App, die einen Cache mit Bildern verwaltet, reagiert möglicherweise mit der Freigabe von Bildern, die derzeit nicht auf dem Bildschirm angezeigt werden.


Wie wird die Warnung zur Speicherebene beachtet?

Von http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

Wenn das System eine Warnung zu wenig Speicher an Ihre App sendet, reagieren Sie sofort. iOS benachrichtigt alle laufenden Apps, wenn die Menge an freiem Speicher unter einen sicheren Schwellenwert fällt. (Suspendierte Apps werden nicht benachrichtigt.) Wenn Ihre App diese Warnung erhält, muss sie so viel Speicher wie möglich freigeben. Der beste Weg, dies zu tun, besteht darin, starke Verweise auf Caches, Bildobjekte und andere Datenobjekte zu entfernen, die später neu erstellt werden können.

UIKit bietet verschiedene Möglichkeiten, um Warnungen zu wenig Speicher zu erhalten, darunter die folgenden:

  • Implementieren Sie die applicationDidReceiveMemoryWarning: -Methode Ihres App-Delegaten.
  • Überschreiben Sie die didReceiveMemoryWarning-Methode in Ihrer benutzerdefinierten UIViewController-Unterklasse.
  • Registrieren Sie sich, um die UIApplicationDidReceiveMemoryWarningNotificationnotification zu erhalten.

Wie können Sie den Speicherbedarf Ihrer App reduzieren?

  • Beseitigen Sie Speicherlecks.
  • Machen Sie Ressourcendateien so klein wie möglich.
  • Verwenden Sie Core Data oder SQLite für große Datenmengen.
  • Laden Sie Ressourcen träge.
  • Erstellen Sie Ihr Programm mit der Option Daumen.

Details unter http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


Wie kann man Speicher mit Bedacht zuweisen?

  • Reduzieren Sie die Verwendung von automatisch freigegebenen Objekten : Mit der automatischen Referenzzählung (ARC) ist es besser, Objekte zuzuweisen / zu initialisieren und sie vom Compiler zum richtigen Zeitpunkt für Sie freigeben zu lassen. Dies gilt auch für temporäre Objekte, die Sie in der Vergangenheit möglicherweise automatisch freigegeben haben, um zu verhindern, dass sie über den Umfang der aktuellen Methode hinausgehen.
  • Ressourcenbeschränkungen auferlegen: Vermeiden Sie das Laden einer großen Ressourcendatei, wenn eine kleinere ausreicht. Verwenden Sie anstelle eines hochauflösenden Bildes ein Bild, das für iOS-basierte Geräte geeignet ist. Wenn Sie große Ressourcendateien verwenden müssen, finden Sie Möglichkeiten, um nur den Teil der Datei zu laden, den Sie zu einem bestimmten Zeitpunkt benötigen. Verwenden Sie beispielsweise die Funktionen mmap und munmap, anstatt Teile der Datei in den Speicher zu laden, anstatt Teile der Datei in den Speicher zu laden. Weitere Informationen zum Zuordnen von Dateien zum Speicher.
  • Vermeiden Sie unbegrenzte Problemgruppen : Für unbegrenzte Problemgruppen ist möglicherweise eine beliebig große Datenmenge erforderlich. Wenn das Set mehr Speicher benötigt als verfügbar ist, kann Ihre App die Berechnungen möglicherweise nicht abschließen. Ihre Apps sollten solche Sätze nach Möglichkeit vermeiden und Probleme mit bekannten Speicherbeschränkungen bearbeiten.
Md Mahbubur Rahman
quelle