Was ist die maximale Menge an RAM kann die app nutzen?
Bin ich sehr neugierig über diese Frage, über die Speicher-management des Android-Betriebssystem, so hoffe ich für eine Recht ausführliche Antwort zu diesem Thema.
Was ich gerne wissen würde:
- Was ist der maximale Arbeitsspeicher (in Megabyte /als
Prozentsatz des gesamten RAM), dass ein Android-Anwendung (das ist nicht eine system-app) nutzen kann? - Gibt es irgendwelche Unterschiede zwischen Android-Versionen?
- Gibt es irgendwelche Unterschiede bezüglich der Hersteller von dem Gerät?
Und vor allem:
- Was gilt /was hängt es ab,, wenn es um das system ermitteln, wie viel RAM eine app kann zur Laufzeit (unter der Annahme, dass der Speicher maximaler pro-app ist keine statische Zahl)?
Was ich gehört habe bisher (bis 2013):
- Frühen Android-Geräte hatten eine pro-app Kappe 16MB
- Später diese Obergrenze erhöht sich auf 24 MB oder 32 MB
Was macht mich sehr neugierig:
Diese beiden Grenzen sind sehr niedrig.
Ich habe gerade vor kurzem heruntergeladen Android Task-Manager zu überprüfen, meine Geräte RAM. Was ich bemerkt habe ist, dass es Anwendungen mit um die 40-50 MB RAM, das ist offensichtlich mehr als die genannten maximalen RAM Verbrauch von sagen wir mal 32 MB. Also, wie funktioniert Android, festzustellen, wie viel RAM eine app benutzen kann? Wie ist es möglich, dass apps, die überschreiten diese Grenze?
Desweiteren habe ich bemerkt, dass einige apps von mir crash (getötet durch das system?) mit einem OutOfMemoryException bei etwa 30-40 Megabyte. Auf der anderen Seite, ich habe apps auf meinem Handy mit 100 MB und mehr nach einiger Zeit (wohl wegen memory leaks), die nicht Abstürzen oder getötet werden aus.
So es offensichtlich hängt auch von der app selbst, wenn es darum geht zu bestimmen, wie viel RAM kann geschont werden. Wie ist das möglich?
(Ich führte meine tests mit einem HTC One S mit 768 MB RAM)
Disclaimer: ich bin NICHT in Verbindung mit Android Task-Manager-app in keiner Weise.
InformationsquelleAutor Philipp Jahoda | 2013-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass je nach Gerät unterschiedlich.
getMemoryClass()
aufActivityManager
geben Sie den Wert für das Gerät, das der code ausgeführt wird, auf.Ja, soweit OS-Anforderungen haben im Laufe der Jahre erhöht, und die Geräte passen.
Ja, sofern die Hersteller bauen Geräte, und die Größe variiert je nach Gerät.
Ich habe keine Ahnung was "- Seite Faktoren" bedeutet.
Das ist in etwa richtig. Bildschirm-Auflösung ist ein bedeutender Faktor, da höhere Auflösungen bedeuten größere bitmaps, und so Tabletten und hochauflösende Handys haben tendenziell höhere Werte noch. Zum Beispiel, sehen Sie die Geräte mit 48 MB Haufen, und ich würde nicht überrascht sein, wenn es höhere Werte als das.
Du davon ausgehen, dass der Autor dieser app weiß, was (s)er tut. Wenn man bedenkt, dass die Speichernutzung der app ist schwierig für ein core-Android-Ingenieur zu bestimmen, würde ich nicht davon ausgehen, dass die app in Frage, ist notwendigerweise die Bereitstellung besonders genaue Ergebnisse.
Dass gesagt wird, nativen code (NDK) nicht unter die heap-Grenze. Und seit Android 3.0, apps können auf Anfrage einen "großen Haufen", in der Regel in den Hunderten von MB, aber das wird als schlechte form für die meisten apps.
Bedenken, dass die Android-Müll-Sammler ist nicht a compacting garbage collector. Die Ausnahme sollte wirklich
CouldNotFindSufficientlyLargeBlockOfMemoryException
, aber das war wohl als zu wortreich.OutOfMemoryException
bedeutet, dass Sie konnte Sie nicht zuordnen, Ihre angeforderten block, nicht, dass Sie erschöpft Ihre heap ganz.Es tut mir Leid, aber ich verstehe nicht, Ihr Anliegen oder was Sie es zu tun hat mit dieser Frage. Möchten Sie vielleicht zu öffnen, einen separaten Stack Overflow Frage, wo Sie im detail erklären, was Ihr Anliegen ist.
vielen Dank, sehr viel. wirklich helfen
InformationsquelleAutor CommonsWare
Memory limits pro app sind hier je nach Display-Größe und Android-version: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing
Quelle: Android-Kompatibilität Downloads http://source.android.com/compatibility/downloads.html;
Compatibility Definition Document (CDD), Abschnitt Virtuelle Maschine, Kompatibilität oder der Runtime-Kompatibilität
InformationsquelleAutor
Es ist Ende 2018, so haben sich die Dinge geändert.
Erstens: führen Sie Ihre app aus und öffnen Sie Android-Profiler " in Android Studio.
Sie werden sehen, wie viel Speicher es verbraucht, Sie werden überrascht sein, aber es kann wählen viel RAM.
Auch hier ist ein großer Artikel, in offiziellen docs mit detaillierten Anweisungen für die Verwendung von Speicher-Profiler, die Ihnen einen detaillierten Blick von Ihrem Speicher-management.
Aber in den meisten Fällen, Ihre regulären Android-Profiler wird genug für Sie sein.
In der Regel, eine app mit 50 MB RAM-Belegung, aber springt sofort bis zu 90 MB beim starten laden einige Fotos im Speicher. Wenn Sie die Aktivität öffnen mit einem ViewPager mit vorinstallierten Bilder (3,5 Mb) können Sie sich 190Mb leicht in Sekunden.
Aber dies bedeutet nicht, Sie haben Probleme mit der Speicherverwaltung.
Den besten Rat, den ich geben kann ist, befolgen Sie die Richtlinien und best practices, top-Bibliotheken für das laden der Bilder (Glide, Picasso) und Sie werden in Ordnung sein.
Aber wenn Sie benötigen, um maßgeschneiderte und etwas, das Sie wirklich brauchen, zu wissen, wie viel Speicher Sie zuweisen, manuell können Sie erhalten insgesamt freier Speicher und berechnet einen vorbestimmten Anteil (in %).
In meinem Fall musste ich den cache entschlüsselt Fotos im Speicher, so brauche ich nicht zu entschlüsseln, die Ihnen jedesmal, wenn der Benutzer gleitet durch die Liste.
Zu diesem Zweck können Sie verwenden, gebrauchsfertig LruCache Klasse. Es ist eine cache-Klasse, die automatisch tracks, wie viel Speicher Ihre Objekte zuweisen (oder die Anzahl von Instanzen) und entfernt die ältesten zu halten, die letzten, die von Ihrer Nutzung Geschichte.
Hier ist ein tolles tutorial auf, wie es zu benutzen.
In meinem Fall habe ich 2 Instanzen des caches: für Daumen und Anlagen.
Machte Sie statische singleton-Zugang, so sind Sie Global verfügbar sind überall in der app.
cache-Klasse:
Dies ist, wie ich berechnen verfügbaren freien RAM und wie viel ich bei einem Biss aus ihm heraus:
Und dies ist, wie ich es in den Adapter zu bekommen zwischengespeicherte Bild:
und wie ich es in den cache im hintergrund-thread (regelmäßige AsyncTask):
Meine app Ziele API-19+ so Geräte, die sind nicht alt und diese Teile des verfügbaren RAM sind gut genug für den cache in meinem Fall (1% und 3%).
Fun fact: Android nicht irgendwelche APIs oder andere hacks, um die Menge des Arbeitsspeichers auf Ihrem app, es ist dynamisch berechnet, basierend auf verschiedenen Faktoren.
P. S. ich bin mit einem statischen Feld Klasse zu halten, ein cache, aber nach den neuesten Android Richtlinien des seinen empfohlen zu verwenden ViewModel-Architektur-Komponente für diesen Zweck.
InformationsquelleAutor Kirill Karmazin