Подтвердить что ты не робот

Проблемы с распределением памяти с помощью приложения android

У меня есть приложение для Android, которое выполняет анализ изображения, управление которым осуществляется с помощью IntentService - процесс занимает пару секунд каждый раз и работает точно и быстро.

Но когда процесс повторяется в приложении примерно в 50 раз (как показано на рисунке), он начинает становиться очень медленным до тех пор, пока приложение и устройство не станут непригодными для использования. Когда устройство перезагружается и приложение открывается снова, оно выполняется как обычно.

Проверка в Android Studio. Я вижу, что каждый раз, когда я запускаю анализ, распределение памяти для приложения увеличивается и увеличивается каждый раз примерно на 1 МБ. Таким образом, у него явно не хватает памяти, когда он падает.

Я использовал этот флаг для завершения анализа и перехода к результату, чтобы исправить фоновые действия;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

который имеет минимальный эффект, и я понимаю, что IntentService управляет тем, что закрывается. Поэтому не уверен, что еще я могу сделать, чтобы попытаться уменьшить выделение памяти или хотя бы очистить выделение и перестать добавлять к ней?

Рабочий процесс анализа изображений

Дополнительная информация:

  • Приложение использует реализацию камеры на основе Google Camera2
  • Анализ выполняется с помощью библиотеки С++ через IntentService
4b9b3361

Ответ 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

Возможно, так бывает, если это произойдет, если ваша рабочая служба намерения после завершения работы может быть вашей не уничтожить службу

Проверить настройки, запускающие список служб для запуска службы вашего приложения