Проблемы с распределением памяти с помощью приложения android
У меня есть приложение для Android, которое выполняет анализ изображения, управление которым осуществляется с помощью IntentService
- процесс занимает пару секунд каждый раз и работает точно и быстро.
Но когда процесс повторяется в приложении примерно в 50 раз (как показано на рисунке), он начинает становиться очень медленным до тех пор, пока приложение и устройство не станут непригодными для использования. Когда устройство перезагружается и приложение открывается снова, оно выполняется как обычно.
Проверка в Android Studio. Я вижу, что каждый раз, когда я запускаю анализ, распределение памяти для приложения увеличивается и увеличивается каждый раз примерно на 1 МБ. Таким образом, у него явно не хватает памяти, когда он падает.
Я использовал этот флаг для завершения анализа и перехода к результату, чтобы исправить фоновые действия;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
который имеет минимальный эффект, и я понимаю, что IntentService управляет тем, что закрывается. Поэтому не уверен, что еще я могу сделать, чтобы попытаться уменьшить выделение памяти или хотя бы очистить выделение и перестать добавлять к ней?
![Рабочий процесс анализа изображений]()
Дополнительная информация:
- Приложение использует реализацию камеры на основе Google Camera2
- Анализ выполняется с помощью библиотеки С++ через IntentService
Ответы
Ответ 1
Кажется, что вы не правильно обрабатываете ресурсы (переменные, файлы изображений и т.д.), а также создаете утечку памяти в своем приложении.
вы можете найти здесь, в этом блоге Написано Johan по обработке утечек памяти в вашем приложении или см. этот SO-вопрос.
Избегайте утечек памяти на Android
Если утечка памяти генерируется в библиотеке С++, вы можете легко найти ресурс, который пропускает память в режиме отладки.
После результата результата вы должны вызвать сборщик мусора, как это было предложено Grisgram, и закрыть любые неиспользуемые ресурсы.
Было бы хорошо, если бы вы могли предоставить трассировку стека в вопросе.
Ответ 2
Попробуйте использовать leakCanary https://github.com/square/leakcanary, чтобы узнать, что вызывает утечку, и используйте weakReference https://developer.android.com/reference/java/lang/ref/WeakReference.html, чтобы можно было собрать мусор, когда это необходимо. Возможно также, что используемое вами устройство не имеет достаточного объема памяти для одновременного хранения 50 изображений с высоким разрешением в памяти. Вы можете попытаться снизить разрешение изображений, если вы храните их в памяти, и убедитесь, что вы перерабатываете растровые изображения https://developer.android.com/topic/performance/graphics/manage-memory.html
Я также хотел бы использовать threadPoolExecutor вместо службы намерения, они гораздо более настраиваются https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
Ответ 3
Я хотел добавить что-то в ответ Ali786.
Intent Services на самом деле не лучший выбор для того, что будет повторяться. При следующем вызове службы он переходит в очередь.
Настраиваемые службы работают как HandlerThreads. Они имеют свои собственные MessageQueues, и после того, как вы запустите сервис с Intent, он будет ждать предыдущего.
Обычные службы, которые запускаются в потоке пользовательского интерфейса, работают параллельно.
Я не уверен, что вы делаете что-то после того, как вы отправите информацию анализа на вашу деятельность, но если вы это сделаете, служба намерения не умрет, а следующей придется ждать. Интеллектуальные услуги не являются лучшим выбором для общения с вашим потоком пользовательского интерфейса, Asynctask может быть лучше в вашем случае. Если вы дадите нам дополнительную информацию (код), возможно, мы сможем дать вам более точный ответ.
Надеюсь, это поможет!
Ответ 4
Возможно, так бывает, если это произойдет, если ваша рабочая служба намерения после завершения работы может быть вашей не уничтожить службу
Проверить настройки, запускающие список служб для запуска службы вашего приложения