Ich habe / proc / meminfo verwendet und die Befehlsantwort analysiert. Das Ergebnis zeigt jedoch Folgendes:
MemTotal: 94348 kB MemFree: 5784 kB
meint. Es zeigt, dass nur 5 MB freier Speicher vorhanden sind. Ist es mit Android Mobile möglich? Auf meinem Handy sind nur 5-6 Anwendungen installiert, und es wird keine andere Aufgabe ausgeführt. Trotzdem zeigt dieser Befehl, dass nur sehr wenig freier Speicher vorhanden ist.
Kann jemand das klären? oder gibt es eine andere Möglichkeit, die Speichernutzung in Android zu erhalten?
android
memory-management
Badal
quelle
quelle
Debug.getNativeHeapFreeSize()
.Antworten:
VORSICHT: Diese Antwort misst die Speichernutzung / Verfügbarkeit des GERÄTS. Dies ist NICHT das, was für Ihre App verfügbar ist. Verwenden Sie die Antwort des Android-Entwicklers, um zu messen, was Ihre APP tut und was dazu berechtigt ist .
Android-Dokumente - ActivityManager.MemoryInfo
Befehl parse / proc / meminfo. Den Referenzcode finden Sie hier: Get Memory Usage in Android
Verwenden Sie den folgenden Code und erhalten Sie den aktuellen RAM:
Erläuterung der Nummer 0x100000L
Es ist ziemlich offensichtlich, dass die Zahl verwendet wird, um von Bytes in Mebibyte umzuwandeln
PS: Wir müssen den Gesamtspeicher nur einmal berechnen. Rufen Sie also Punkt 1 nur einmal in Ihrem Code auf und danach können Sie den Code von Punkt 2 wiederholt aufrufen.
quelle
Dies hängt von Ihrer Definition ab, welche Speicherabfrage Sie erhalten möchten.
Normalerweise möchten Sie den Status des Heap-Speichers wissen, da Sie bei zu viel Speicher OOM erhalten und die App zum Absturz bringen.
Dazu können Sie die nächsten Werte überprüfen:
Je näher die Variable "usedMemInMB" an "maxHeapSizeInMB" heranrückt, desto näher
availHeapSizeInMB
kommt sie an Null, desto näher kommt OOM. (Aufgrund der Speicherfragmentierung erhalten Sie möglicherweise OOM, BEVOR dies Null erreicht.)Das zeigt auch das DDMS-Tool zur Speichernutzung.
Alternativ gibt es die tatsächliche RAM-Auslastung, dh wie viel das gesamte System verbraucht - siehe akzeptierte Antwort, um dies zu berechnen.
Update: Da Android O Ihre App dazu bringt, auch den nativen Arbeitsspeicher (zumindest für den Bitmaps-Speicher, der normalerweise der Hauptgrund für die enorme Speichernutzung ist) und nicht nur den Heap zu verwenden, haben sich die Dinge geändert und Sie erhalten weniger OOM (weil der Der Heap enthält keine Bitmaps mehr (siehe hier ). Sie sollten jedoch die Speichernutzung im Auge behalten, wenn Sie den Verdacht haben, dass Speicherlecks vorliegen. Wenn Sie unter Android O Speicherlecks haben, die bei älteren Versionen zu OOM hätten führen sollen, scheint es, dass es nur abstürzt, ohne dass Sie es abfangen können. So überprüfen Sie die Speichernutzung:
Ich glaube jedoch, dass es am besten ist, den Profiler der IDE zu verwenden, der die Daten in Echtzeit mithilfe eines Diagramms anzeigt.
Die gute Nachricht für Android O ist, dass es aufgrund der OOM, zu viele große Bitmaps zu speichern, viel schwieriger ist, Abstürze zu bekommen, aber die schlechte Nachricht ist, dass ich nicht glaube, dass es möglich ist, einen solchen Fall zur Laufzeit zu erfassen.
EDIT: scheint
Debug.getNativeHeapSize()
sich im Laufe der Zeit zu ändern, da es Ihnen den maximalen Gesamtspeicher für Ihre App anzeigt. Diese Funktionen werden also nur für den Profiler verwendet, um zu zeigen, wie viel Ihre App verwendet.Wenn Sie den tatsächlichen und verfügbaren nativen RAM erhalten möchten, verwenden Sie Folgendes:
quelle
Hier ist eine Möglichkeit, die Speichernutzung der aktuell ausgeführten Anwendung zu berechnen :
quelle
Runtime.freeMemory()
0 und nurRuntime.totalMemory()
der aktuell zugewiesene Speicher zurückgegeben.Ein anderer Weg (zeigt derzeit 25 MB frei auf meinem G1):
quelle
Die Speicherverwaltungsphilosophie von Linux lautet "Freier Speicher ist verschwendeter Speicher".
Ich gehe davon aus, dass die nächsten beiden Zeilen zeigen, wie viel Speicher in "Puffern" und wie viel "zwischengespeichert" ist. Obwohl es einen Unterschied zwischen den beiden gibt (bitte fragen Sie nicht, was dieser Unterschied ist :), addieren sich beide ungefähr zu der Menge an Speicher, die zum Zwischenspeichern von Dateidaten und Metadaten verwendet wird.
Eine weitaus nützlichere Anleitung zum Freigeben von Speicher auf einem Linux-System ist der
free(1)
Befehl. Auf meinem Desktop werden folgende Informationen angezeigt:Die +/- Puffer / Cache: -Linie ist die magische Linie. Sie gibt an, dass ich wirklich ungefähr 589 Megabyte aktiv benötigten Prozessspeicher und ungefähr 5391 Megabyte 'freien' Speicher in dem Sinne habe, dass die 91 + 374 Megabyte von Puffern / zwischengespeichertem Speicher kann weggeworfen werden, wenn der Speicher an anderer Stelle rentabler verwendet werden könnte.
(Mein Computer ist seit ungefähr drei Stunden in Betrieb und hat fast nichts als einen Stapelüberlauf ausgeführt, weshalb ich so viel freien Speicher habe.)
Wenn Android nicht mit ausgeliefert wird
free(1)
, können Sie die Berechnung selbst mit der/proc/meminfo
Datei durchführen. Ich mag nur dasfree(1)
Ausgabeformat. :) :)quelle
cat /proc/meminfo
stattdessen. Es ist viel detaillierter, aberMemFree
.Buffers
undCached
sind wahrscheinlich die wichtigsten Zeilen.Ich beziehe mich auf einige Schriften.
Referenz:
Diese getMemorySize () -Methode wird als MemorySize zurückgegeben, die eine Gesamtgröße und eine freie Speichergröße aufweist.
Ich glaube diesen Code nicht perfekt.
Dieser Code wird auf LG G3 Kat.6 (v5.0.1) getestet.
Ich weiß, dass Pattern.compile () teure Kosten verursacht, sodass Sie den Code möglicherweise in ein Klassenmitglied verschieben können.
quelle
Ich habe mir Android Source Tree angesehen.
In com.android.server.am. ActivityManagerService.java (interner Dienst, der von android.app. ActivityManager verfügbar gemacht wird ).
In android.os. Process.java
Es ruft die JNI-Methode von android_util_Process.cpp auf
Fazit
MemoryInfo.availMem = MemFree + Zwischengespeichert in / proc / meminfo.
Anmerkungen
Der Gesamtspeicher wird in API-Ebene 16 hinzugefügt.
quelle
Sie können auch das DDMS-Tool verwenden, das Teil des Android SDK selbst ist. Es hilft auch dabei, Speicherzuordnungen für Java-Code und nativen C / C ++ - Code zu erhalten.
quelle
quelle
Es ist ein seltsamer Code. Es gibt MaxMemory - (totalMemory - freeMemory) zurück. Wenn freeMemory gleich 0 ist, gibt der Code MaxMemory - totalMemory zurück, sodass mehr oder gleich 0 sein kann. Warum wird freeMemory nicht verwendet?
quelle
Hier ist eine andere Möglichkeit, die Speichernutzung Ihrer App anzuzeigen:
Beispielausgabe:
Für die allgemeine Speichernutzung:
https://developer.android.com/studio/command-line/dumpsys#meminfo
quelle