2014-04-01 8 views
5

Wir haben eine Android-Hardware/Software-Kombination, die wir bei Kunden installieren.Android läuft mit wenig Speicher, ohne ersichtlichen Grund

Auf bestimmten Tablets beginnt der Speicher langsam zu laufen, und Android beginnt mit dem Töten unserer App, die dann automatisch von unserem Watchdog-Dienst neu gestartet wird.

Hier ist der Code, wir per-app memory usage überwachen verwenden:

for(RunningAppProcessInfo info : am.getRunningAppProcesses()) {  
     int memused = am.getProcessMemoryInfo(
         new int[]{info.pid})[0].getTotalPss(); 

     Log.log(DIAG_INFO, "Process Mem: " + info.processName, memused); 
    } 

Hier ist der Code, der uns overall system memory levels

  MemoryInfo mi = new MemoryInfo(); 
     am.getMemoryInfo(mi); 
     long availableMegs = mi.availMem/1048576L; 
     long threshold = mi.threshold /1048576L; 

availableMegs Tropfen in der Nähe des threshold (64mb in unserem Fall) bekommt und Android fängt an, Sachen zu töten.

Aber, wenn wir die pro-Prozess Speicherbelegung betrachten, addieren Sie die TotalPss Werte, wir erhalten eine normale Summe. Kein Prozess, der speichermäßig außer Kontrolle ist!

Irgendwelche Ideen, wo der fehlende RAM verschwunden ist?

+0

Sie haben alle offene Verbindungen zu einem Datenbank/Web-Service von einigen Arten, die ihr möglicherweise fehlen? – ksudu94

+2

Ich denke, der Gesamt-PSS-Wert gibt Ihnen nur die Benutzerspeicherbelegung (Alle Benutzerraumprozesse, auf die der Aktivitätsmanager zugreifen kann). Der gesamte Speicher ist Kernel + Treiber + Benutzerprozesse. am.getMemoryInfo() ruft die Informationen aus/proc/meminfo ab, die ziemlich genau auf die gesamte Systemspeicherauslastung bezogen sind. Auf diesen Tabs stimmt möglicherweise etwas nicht. nur ein Gedanke!! – digitizedx

+1

Ich gehe davon aus, dass 'getRunningAppProcesses()' wahrscheinlich keinen Kernel oder anderen Speicherverbrauch auf Systemebene zurückgibt. wahrscheinlich nur auf der Anwendung/Dalvik Ebene. – minhaz

Antwort

4

Haben Sie ein externes Tool wie den Eclipse Memory Analyzer (MAT) verwendet? Dadurch erhalten Sie möglicherweise eine bessere Perspektive als Ihre In-App-Messungen. Es ist nicht schwer zu benutzen, erfordert aber ein wenig Setup. Here's a pretty good write-up seiner Nutzung.

Eine Lösung, die Speicher über alle Apps auf dem Gerät verteilt, befindet sich in der Eclipse-Systeminformationenansicht. Um es zu verwenden, öffnen Sie die Perspektive und wählen Sie ein Gerät in der Ansicht Devices. Öffnen Sie dann die System Information Ansicht und wählen Sie Memory usage in der linken Dropdown-Liste. Sie können bei jedem Klicken auf Update from Device einen Snapshot des Speichers abrufen, der auf dem Gerät verwendet wird.

enter image description here

+0

Leider sind die Einheiten, die dieses Speicherproblem aufweisen, an Kundenstandorten, in Stahlgehäusen, in geschäftigen Räumen, so dass es nicht einfach ist, sie in Eclipse zu stecken. –

+1

Es sind nicht annähernd so viele In-App-Tools verfügbar. Die S/O Frage http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android hat eine gut geschriebene Antwort, die Gedächtnisfragen bespricht. Wenn Sie von dort verlinken, gelangen Sie zu http://developer.android.com/training/articles/memory.html und von dort http://developer.android.com/tools/debugging/debugging-memory.html. Könnte einen Blick wert sein. – scottt

+0

danke für Ihre Hilfe. Ihnen eine Aufzählung geben, aber warten, um zu sehen, ob jemand eine Antwort auf die ursprüngliche Frage anbieten kann, d. h. wie können wir herausfinden, welcher Prozess wenig Speicher verursacht und warum die in der Frage verwendete Strategie nicht funktioniert. –

Verwandte Themen