Пытаясь уменьшить память приложения, какие значения я должен регистрировать?
Моему приложению часто не хватает памяти. Я работаю над сокращением использования памяти, но я хотел бы регистрировать, сколько памяти в среднем используют мои пользователи, имеют доступ и т. д., Чтобы увидеть, оказывают ли изменения, которые я делаю, какое-либо влияние на реальный мир.
Я нашел эти значения, которые я мог захватить:
long totalMemory = Runtime.getRuntime().totalMemory();
long freeMemory = Runtime.getRuntime().freeMemory();
long maxMemory = Runtime.getRuntime().maxMemory();
Но я не уверен, что они правильные. Является ли это значение freeMemory
тем, которое скажет мне, если я, вероятно, получу OutOfMemoryError
? Если нет,то какие значения я должен регистрировать?
1 ответ:
Является ли это значение freeMemory одним из тех, которые сказали бы мне, если я, вероятно, получу OutOfMemoryError?
Вероятно, нет.
OutOfMemoryError
произойдет, когда вы попытаетесь сделать выделение, и нет свободного блока, достаточно большого, чтобы выполнить этот запрос, даже после аварийного запуска сборки мусора. На Android 7.1 и старше, из-за природы сборщика мусора, это может произойти, потому что ваша куча становится фрагментированной.freeMemory()
указывает сумму всех свободных блоков, а не размер блока. самый большой свободный блок.Итак, вам нужно посмотреть на
OutOfMemoryError
сбои, которые вы получаете. Как правило, в Android они будут поступать из больших выделений, таких как загрузка aBitmap
. Если это источник ваших сбоев, тоfreeMemory()
будет мало пользы, и вы ничего не сможете зарегистрировать.Если, с другой стороны, вы получаете сбои для довольно небольших выделений (скажем, 128 байт и ниже), то, скорее всего, вы действительно исчерпываете свою кучу. В этом случае
freeMemory()
может оказаться полезным протоколировать.