Ich verarbeite Streams von Bildern in meiner App. Einige der Bilder können sehr groß sein. Also muss ich herausfinden, ob ich es überhaupt mit dem verbleibenden Speicher verarbeiten kann, bevor ich ein Bild verarbeite. Aber wie kann ich wissen, wie viel Speicher ich noch nutzen kann?
Für die letzte Frage oben habe ich versucht, nur freien Speicher zu verwenden. Ich bin mir sicher, dass es nicht richtig ist, da die meiste Zeit freier Speicher sehr wenig ist und was ich tatsächlich nutzen kann, kann das problemlos übertreffen. Ich habe auch versucht ( freier Speicher + inaktiver Speicher ). Scheint immer noch nicht ganz richtig, da ich mehr als das ohne Probleme in meinen Experimenten verwenden kann. Eine Schwierigkeit besteht darin, dass das System, wenn meine App aktiv ist und mehr Speicher benötigt, andere inaktive Apps beenden kann, um mehr Speicherplatz für meine App zu erhalten. Ich muss diesen später gesparten Betrag berücksichtigen, wenn ich den verbleibenden Speicher, den ich verwenden kann, berechne.
Frage 1:
Sie verwechseln den virtuellen Speicher mit dem Konzept des Tauschens. Es ist ein häufiger Fehler.
Virtueller Speicher ist die Gesamtmenge von Adressraum , die Ihrem Prozess zugeordnet und zugänglich ist und nicht die Menge des direkt verwendeten Speichers.
Dies beinhaltet:
mmap
ed-Dateien entspricht Es ist der dritte von ihnen, der den Großteil der Adressraumnutzung ausmacht, da er die schreibgeschützten Teile des ausführenden Codes und insbesondere die gemeinsam genutzten Bibliotheken enthält. Das Betriebssystem wird einige dieser residenten im physischen Speicher behalten, kann sie aber bei Bedarf abwerfen (sie können bei Bedarf immer von der Platte neu geladen werden).
Swapping ist der Vorgang, bei dem die zu einem Prozess gehörigen Dirty Pages auf Disc geschrieben werden. In iOS gibt es kein Swapping. Stattdessen fordert iOS Anwendungen dazu auf, ihren Speicherverbrauch zu reduzieren, indem nicht verwendete View-Controller und Flush-Caches gelöscht werden. Wenn dies das Problem nicht löst, sucht es nach abzutötenden Prozessen. Prozesse, die viel physikalischen Speicher verwenden, sind Hauptkandidaten.
Frage 2:
Der verdrahtete Speicher ist der Adressraum, der immer dem physischen Speicher zugeordnet werden muss. Im verdrahteten Speicher befinden sich folgende Dinge:
Ich bin mir der Unterscheidung zwischen aktiv und inaktiv hier nicht ganz sicher, aber im Allgemeinen sind Datei-Cache (z. B. mmap
ed-Seiten) immer der erste Kandidat für die Neuzuweisung, wenn Druck auf das Gedächtnis ausgeübt wird. In diesem Kontext ist eine freie Seite eine Seite, die das Betriebssystem für nichts verwendet. Alle ordentlichen modernen Betriebssysteme werden immer die meisten ihrer freien Seiten für den Datei-Cache verwenden. Eine Seite ist in der Regel nur frei, weil noch nichts darin zwischengespeichert wurde.
Denken Sie daran, dass viele dieser Seiten mit Anwendungscode gefüllt sind, bevor Sie glauben, dass alle diese Seiten Ihnen gehören. Wenn dieser Code benötigt wird, wird er von der Festplatte neu geladen.
Frage 3:
Die Summe ist inkonsistent wegen der Aufteilung zwischen Prozessen. Aus diesem Grund speichern gemeinsam genutzte Bibliotheken Speicher. Der Darwin-Kernel basiert auf einer sauberen Optimierung, bei der untergeordnete Prozesse speicherabgebildete Dateien von ihren Eltern erben. Ein oberster übergeordneter Prozess - wahrscheinlich launchd
mmap
s eine große Anzahl von allgemeinen Systembibliotheken und stellt so sicher, dass untergeordnete Prozesse diese kostenlos erhalten. Dies führt zu einem großen Anteil an virtuellem Adressraum in jedem Prozess und erklärt, warum sie bei ~ 600 MB ziemlich ähnlich sind.
Frage 4:
Sie können nicht zuverlässig. Ihre einzige Option ist es, es empirisch zu tun. Mit anderen Worten, wie viel Speicher können Sie verbrauchen, ohne dass Ihre Anwendung dazu führt, dass die Leistung des Rests des Systems ausgelastet wird oder dass das Betriebssystem vom Betriebssystem zur Verwendung zu vieler Ressourcen beendet wird? Sie können sich nicht einmal darauf verlassen, dass die freien Seiten mehr als nur kurzfristig verfügbar sind.
Ich weiß derzeit nicht, wie ich wissen soll, wie viel Speicherplatz Ihnen noch bleibt.
iOS gibt Ihrer App jedoch Speicherwarnungen um Sie wissen zu lassen, dass freies Gedächtnis sehr knapp ist. Wenn Ihre App eine dieser Warnungen erhält, sollten Sie damit beginnen, Speicher freizugeben.
Siehe Richtlinien zur Verwendung von Speicherauslastung und insbesondere:
Wenn ein Zustand mit wenig Speicher erkannt wird, liefert das System Speicherarme Warnungen an alle laufenden Programme (einschließlich Ihrer Anwendung) und kann einige Hintergrundanwendungen beenden (wenn notwendig), um den Erinnerungsdruck zu verringern. Wenn nicht genug Speicher vorhanden ist freigegeben - vielleicht, weil Ihre Anwendung undicht ist oder immer noch zu viel Speicher verbrauchen - das System kann Ihren Computer trotzdem beenden Anwendung.
Grundsätzlich sollten Sie etwas Speicher freigeben, sobald Sie eine Erinnerung mit wenig Speicher erhalten, und es ist Ihnen egal, wie viel Speicherplatz auf dem System frei ist, sonst wird das Betriebssystem Ihre Anwendung irgendwann beenden.