8

Как узнать использование памяти моего приложения на Android?

2

Как программно узнать объем используемой памяти в моем Android-приложении?

Я надеюсь, что существует способ сделать это. Кроме того, как можно получить информацию о свободной памяти на телефоне?

3 ответ(ов)

0

Да, вы можете получить информацию о памяти программным способом и решить, стоит ли выполнять ресурсоемкие операции.

Чтобы получить размер кучи виртуальной машины, используйте следующий вызов:

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

0

Это работа в процессе, но вот что мне непонятно:

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?

0
  1. Я полагаю, что нет, по крайней мере, не из 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().

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь