Как узнать использование памяти моего приложения на Android?
Как программно узнать объем используемой памяти в моем Android-приложении?
Я надеюсь, что существует способ сделать это. Кроме того, как можно получить информацию о свободной памяти на телефоне?
3 ответ(ов)
Да, вы можете получить информацию о памяти программным способом и решить, стоит ли выполнять ресурсоемкие операции.
Чтобы получить размер кучи виртуальной машины, используйте следующий вызов:
Runtime.getRuntime().totalMemory();
Чтобы получить выделенную память виртуальной машины, выполните:
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
Для получения предела размера кучи виртуальной машины воспользуйтесь:
Runtime.getRuntime().maxMemory();
Чтобы получить выделенную нативную память, используйте:
Debug.getNativeHeapAllocatedSize();
Я разработал приложение, чтобы понять поведение OutOfMemoryError и отслеживать использование памяти.
Ссылка на приложение: https://play.google.com/store/apps/details?id=net.coocood.oomresearch
Исходный код доступен по адресу: https://github.com/coocood/oom-research
Это работа в процессе, но вот что мне непонятно:
ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
Log.i(TAG, " memoryInfo.availMem " + memoryInfo.availMem + "\n" );
Log.i(TAG, " memoryInfo.lowMemory " + memoryInfo.lowMemory + "\n" );
Log.i(TAG, " memoryInfo.threshold " + memoryInfo.threshold + "\n" );
List<RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
Map<Integer, String> pidMap = new TreeMap<Integer, String>();
for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses)
{
pidMap.put(runningAppProcessInfo.pid, runningAppProcessInfo.processName);
}
Collection<Integer> keys = pidMap.keySet();
for(int key : keys)
{
int pids[] = new int[1];
pids[0] = key;
android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray)
{
Log.i(TAG, String.format("** MEMINFO in pid %d [%s] **\n",pids[0],pidMap.get(pids[0])));
Log.i(TAG, " pidMemoryInfo.getTotalPrivateDirty(): " + pidMemoryInfo.getTotalPrivateDirty() + "\n");
Log.i(TAG, " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n");
Log.i(TAG, " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n");
}
}
Почему PID не сопоставлен с результатом в activityManager.getProcessMemoryInfo()
? Очевидно, вы хотите сделать полученные данные значимыми, так почему же Google сделала так, что сложно установить корреляцию между результатами? Текущая система даже не работает хорошо, если я хочу обработать все данные о использовании памяти, так как возвращаемый результат — это массив объектов android.os.Debug.MemoryInfo
, но ни один из этих объектов на самом деле не говорит, с какими PID они связаны. Если просто передать массив всех PID, у вас не будет способа понять результаты. Насколько я понимаю, имеет смысл передавать только один PID за раз, и если это так, зачем же activityManager.getProcessMemoryInfo()
принимает только массив int?
Я полагаю, что нет, по крайней мере, не из Java.
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
activityManager.getMemoryInfo(mi);
Log.i("memory free", "" + mi.availMem);
Этот код позволяет получить информацию о доступной памяти на устройстве в Android. Сначала мы получаем экземпляр ActivityManager
, а затем создаем объект MemoryInfo
, в который помещаем данные о памяти, вызвав метод getMemoryInfo()
. Результат доступной памяти можно вывести в лог с помощью Log.i()
.
Как создать утечку памяти в Java?
Почему в RecyclerView отсутствует onItemClickListener()?
Не удается запустить Eclipse - Java был запущен, но вернул код завершения = 13
Как явно освободить память в Python?
Можно ли использовать Java 8 для разработки под Android?