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?
masz jakiekolwiek otwarte połączenia z usługą database/web niektórych rodzajach że chłopaki może brakować? – ksudu94
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
Przyjmuję, że 'getRunningAppProcesses()' prawdopodobnie nie zwraca jądra ani innych zastosowań pamięci poziomu systemu. prawdopodobnie tylko na poziomie aplikacji/dalvik. – minhaz