Я использовал / proc / meminfo и проанализировал ответ на команду, но результат показывает, что:
MemTotal: 94348 kB MemFree: 5784 kB
средства. он показывает, что свободной памяти всего 5 МБ. Возможно ли это с мобильным Android? На моем мобильном телефоне установлено всего 5-6 приложений, а другие задачи не выполняются. но все же эта команда показывает, что свободной памяти очень мало.
Может кто-нибудь прояснить это? или есть ли другой способ использования памяти в Android?
android
memory-management
Бадал
источник
источник
Debug.getNativeHeapFreeSize()
.Ответы:
ВНИМАНИЕ: Этот ответ измеряет использование / доступную память УСТРОЙСТВА. Это НЕ то, что доступно вашему приложению. Чтобы измерить, что делает ваше приложение, и РАЗРЕШЕНО ли это делать, используйте ответ разработчика Android .
Документы по Android - ActivityManager.MemoryInfo
команда parse / proc / meminfo. Вы можете найти справочный код здесь: Получить использование памяти в Android
используйте приведенный ниже код и получите текущую оперативную память:
Расшифровка числа 0x100000L
Совершенно очевидно, что число используется для преобразования байтов в мебибайт
PS: нам нужно рассчитать общую память только один раз. поэтому вызывайте точку 1 только один раз в своем коде, а затем после этого вы можете повторно вызывать код точки 2.
источник
Это зависит от вашего определения того, какой запрос памяти вы хотите получить.
Обычно вам нужно знать состояние кучи памяти, поскольку, если она использует слишком много памяти, вы получаете OOM и вылетаете из приложения.
Для этого вы можете проверить следующие значения:
Чем больше переменная usedMemInMB приближается к maxHeapSizeInMB, тем ближе
availHeapSizeInMB
к нулю, тем ближе вы получаете OOM. (Из-за фрагментации памяти вы можете получить OOM ДО того, как он достигнет нуля.)Это также показывает инструмент использования памяти DDMS.
В качестве альтернативы, существует реальное использование ОЗУ, то есть то, сколько использует вся система - см. Принятый ответ, чтобы рассчитать это.
Обновление: поскольку Android O заставляет ваше приложение также использовать собственную оперативную память (по крайней мере, для хранения растровых изображений, что обычно является основной причиной огромного использования памяти), а не только кучу, все изменилось, и вы получаете меньше OOM (потому что куча больше не содержит растровых изображений, проверьте здесь ), но вы все равно должны следить за использованием памяти, если подозреваете, что у вас есть утечки памяти. В Android O, если у вас есть утечки памяти, которые должны были вызвать OOM в более старых версиях, кажется, что он просто выйдет из строя, и вы не сможете его поймать. Вот как проверить использование памяти:
Но я считаю, что лучше всего использовать профилировщик IDE, который отображает данные в реальном времени с помощью графика.
Итак, хорошая новость для Android O заключается в том, что намного сложнее получить сбои из-за OOM хранения слишком большого количества больших растровых изображений, но плохая новость заключается в том, что я не думаю, что возможно выявить такой случай во время выполнения.
РЕДАКТИРОВАТЬ: кажется
Debug.getNativeHeapSize()
со временем меняется, так как он показывает общий максимальный объем памяти для вашего приложения. Таким образом, эти функции используются только для профилировщика, чтобы показать, сколько использует ваше приложение.Если вы хотите получить реальную общую и доступную собственную оперативную память, используйте это:
источник
Вот способ рассчитать использование памяти запущенным в данный момент приложением :
источник
Runtime.freeMemory()
возвращает 0 иRuntime.totalMemory()
возвращает только выделенную в данный момент память.Другой способ (в настоящее время на моем G1 отображается 25 МБ свободного места):
источник
Философия управления памятью Linux такова: «Свободная память - это потраченная впустую память».
Я предполагаю, что следующие две строки покажут, сколько памяти находится в «Буферах» и сколько в «Кэшированных». Хотя между ними есть разница (пожалуйста, не спрашивайте, в чем эта разница :), они оба примерно в сумме составляют объем памяти, используемый для кеширования файловых данных и метаданных.
Намного более полезным руководством по освобождению памяти в системе Linux является
free(1)
команда; на моем рабочем столе он сообщает такую информацию:Строка +/- buffers / cache: - это волшебная строка, она сообщает, что у меня действительно есть около 589 мегабайт активно необходимой памяти для процессов и около 5391 мегабайт «свободной» памяти, в том смысле, что 91 + 374 мегабайта буферов / кэшированной памяти можно выбросить, если ее можно с большей выгодой использовать в другом месте.
(Моя машина работала около трех часов, почти ничего не делая, кроме stackoverflow, поэтому у меня так много свободной памяти.)
Если Android не
free(1)
входит в комплект поставки, вы можете сами посчитать с/proc/meminfo
файлом; Мне просто нравитсяfree(1)
выходной формат. :)источник
cat /proc/meminfo
. Это гораздо более подробно, ноMemFree
.Buffers
, иCached
, вероятно, самые важные строки.Я ссылаюсь на несколько работ.
ссылка:
Этот метод getMemorySize () возвращается MemorySize с общим и свободным объемом памяти.
Я не совсем верю этому коду.
Этот код тестируется на LG G3 cat.6 (v5.0.1)
Я знаю, что Pattern.compile () стоит дорого, поэтому вы можете переместить его код в член класса.
источник
Я посмотрел на Android Source Tree.
Внутри com.android.server.am. ActivityManagerService.java (внутренняя служба, предоставляемая android.app. ActivityManager ).
Внутри android.os. Process.java
Он вызывает метод JNI из android_util_Process.cpp
Вывод
MemoryInfo.availMem = MemFree + Кэшируется в / proc / meminfo.
Ноты
Общая память добавлена на уровне API 16.
источник
вы также можете использовать инструмент DDMS, который сам является частью Android SDK. он также помогает в выделении памяти для Java-кода и нативного кода c / c ++.
источник
источник
Странный код. Он возвращает MaxMemory - (totalMemory - freeMemory). Если freeMemory равно 0, тогда код вернет MaxMemory - totalMemory, поэтому он может быть больше или равен 0. Почему freeMemory не используется?
источник
Вот еще один способ просмотреть использование памяти вашим приложением:
Пример вывода:
Для общего использования памяти:
https://developer.android.com/studio/command-line/dumpsys#meminfo
источник