Wie viel Speicher kann ich noch nutzen?

9

Mein Problem:

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?

Meine Forschungsergebnisse:

  1. Ich kann den Gesamtspeicher und Benutzerspeicher mit diesem UIDevice Erweiterung .
  2. Ich kann virtuell , resident , verkabelt , aktiv , inaktiv und freien Speicher von dies .

Meine Protokolle:

%Vor%

Meine Fragen:

  1. Was bedeutet die Menge an virtuellem Speicher auf iOS? Wie ich weiß, hat iOS keinen Swap, also ist keine Festplatte involviert. Aber ich fand es CAN und die meiste Zeit übersteigt Benutzerspeicher und sogar Gesamtspeicher .
  2. Wie ist die Beziehung zwischen residenten Speicher und { verdrahteten , aktiven , inaktiven } Speichern? Ich kenne die Beziehungen zwischen der letzteren Gruppe.
  3. Warum ist die Summe von { verdrahtet , aktiv , inaktiv , frei } Speicher inkonsistent? Wie lauten die Beziehungen zwischen dieser Summe und dem Gesamtspeicher oder Benutzerspeicher oder virtuellem Speicher ?
  4. Wie kann ich den verbleibenden Speicherplatz berechnen, den ich in meiner App verwenden 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.

    
an0 13.12.2013, 17:31
quelle

3 Antworten

3

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:

  • Private Seiten (z. B. solche, die vom Prozess geschrieben wurden)
  • Geteilte Seiten
  • Virtueller Adressraum, der mmap ed-Dateien entspricht
  • IO-Adressraum des Peripherie-Speichers, der in Prozessen abgebildet wird - GPU-Speicher ist der übliche, aber auch manchmal serielle Busse wie Infiniband, Firewire und wahrscheinlich Thunderbolt

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:

  • Das Betriebssystem selbst (einige Betriebssysteme - wie der Windows NT Kernel - können tatsächlich Teile von sich selbst austauschen, aber Darwin nicht)
  • Private Daten, die vom Betriebssystem verwendet werden
  • IO-Puffer für DMA
  • verwendet
  • Jeder Speicher, der mit der GPU geteilt wird.

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.

    
marko 13.12.2013 18:09
quelle
0

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.

    
BergQuester 13.12.2013 17:34
quelle
0

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.

    
Ivan Genchev 13.12.2013 18:11
quelle

Tags und Links