2014-04-01 10 views
5

Mamy zestaw sprzętowo-programowy z Androidem, który instalujemy na stronach klientów.Android ma mało pamięci, bez oczywistego powodu.

Na niektórych tabletach pamięć zaczyna działać nisko, a Android zaczyna coś robić, zabijając naszą aplikację, która jest następnie automatycznie restartowana przez naszą usługę nadzoru.

Oto kod używamy do monitorowania per-app memory usage:

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

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

Oto kod, który pobiera nam overall system memory levels

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

availableMegs kropli do blisko threshold (64MB w naszym przypadku) i Android zaczyna zabijać rzeczy.

Ale gdy przyjrzymy się zużyciu pamięci na proces, zsumujemy wartości TotalPss, otrzymamy normalną sumę. Żadnego procesu, który nie jest w stanie zapanować nad pamięcią!

Jakieś pomysły, w których brakowało pamięci RAM?

+0

masz jakiekolwiek otwarte połączenia z usługą database/web niektórych rodzajach że chłopaki może brakować? – ksudu94

+2

Myślę, że całkowita wartość PSS daje tylko wykorzystanie pamięci miejsca użytkownika (Wszystkie procesy przestrzeni użytkownika dostępne przez menedżera aktywności). Całkowita pamięć to jądro + sterowniki + procesy użytkownika. am.getMemoryInfo() pobiera informacje z/proc/meminfo, które są dość dokładne w stosunku do całkowitego użycia pamięci systemowej. Coś może być nie tak na tych kartach. tylko myśl! – digitizedx

+1

Przyjmuję, że 'getRunningAppProcesses()' prawdopodobnie nie zwraca jądra ani innych zastosowań pamięci poziomu systemu. prawdopodobnie tylko na poziomie aplikacji/dalvik. – minhaz

Odpowiedz

4

Czy użyłeś zewnętrznego narzędzia, takiego jak Eclipse Memory Analyzer (MAT)? Może to dać lepszą perspektywę niż pomiary w aplikacji. Nie jest trudne w użyciu, ale wymaga nieco konfiguracji. Here's a pretty good write-up z jego użytkowania.

Rozwiązanie, które raportuje pamięć we wszystkich aplikacjach na urządzeniu, znajduje się w widoku Informacje o systemie Eclipse. Aby z niego skorzystać, otwórz perspektywę DDMS i wybierz urządzenie w widoku Devices. Następnie otwórz widok System Information i wybierz Memory usage w lewym menu rozwijanym. Możesz uzyskać migawkę pamięci używanej na urządzeniu za każdym razem, gdy klikniesz na Update from Device.

enter image description here

+0

Niestety, urządzenia, które mają problem z pamięcią, znajdują się w witrynach klientów, w stalowych obudowach, w zapełnionych przestrzeniach, więc nie jest łatwo podłączyć je do zaćmienia. –

+1

Dostępnych jest niemal tyle narzędzi w aplikacji. Pytanie S/O http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android ma dobrze napisaną odpowiedź, która omawia kwestie pamięci. Linkowanie z tego miejsca przeniesie Cię do http://developer.android.com/training/articles/memory.html i tam http://developer.android.com/tools/debugging/debugging-memory.html. Może warto rzucić na to okiem. – scottt

+0

dzięki za pomoc. dając ci szansę, ale czekasz, aby sprawdzić, czy ktoś może zaoferować odpowiedź na pierwotne pytanie, tj. jak możemy dowiedzieć się, co proces powoduje niską pamięć i dlaczego strategia zastosowana w pytaniu nie działa. –

Powiązane problemy