Пытаясь уменьшить память приложения, какие значения я должен регистрировать?


Моему приложению часто не хватает памяти. Я работаю над сокращением использования памяти, но я хотел бы регистрировать, сколько памяти в среднем используют мои пользователи, имеют доступ и т. д., Чтобы увидеть, оказывают ли изменения, которые я делаю, какое-либо влияние на реальный мир.

Я нашел эти значения, которые я мог захватить:

long totalMemory = Runtime.getRuntime().totalMemory();
long freeMemory = Runtime.getRuntime().freeMemory();
long maxMemory = Runtime.getRuntime().maxMemory();

Но я не уверен, что они правильные. Является ли это значение freeMemory тем, которое скажет мне, если я, вероятно, получу OutOfMemoryError? Если нет,то какие значения я должен регистрировать?

1 3

1 ответ:

Является ли это значение freeMemory одним из тех, которые сказали бы мне, если я, вероятно, получу OutOfMemoryError?

Вероятно, нет.

OutOfMemoryError произойдет, когда вы попытаетесь сделать выделение, и нет свободного блока, достаточно большого, чтобы выполнить этот запрос, даже после аварийного запуска сборки мусора. На Android 7.1 и старше, из-за природы сборщика мусора, это может произойти, потому что ваша куча становится фрагментированной. freeMemory() указывает сумму всех свободных блоков, а не размер блока. самый большой свободный блок.

Итак, вам нужно посмотреть на OutOfMemoryError сбои, которые вы получаете. Как правило, в Android они будут поступать из больших выделений, таких как загрузка a Bitmap. Если это источник ваших сбоев, то freeMemory() будет мало пользы, и вы ничего не сможете зарегистрировать.

Если, с другой стороны, вы получаете сбои для довольно небольших выделений (скажем, 128 байт и ниже), то, скорее всего, вы действительно исчерпываете свою кучу. В этом случае freeMemory() может оказаться полезным протоколировать.