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



андроид android-camera2 (3)

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

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

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

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

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

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

Дальнейшие подробности:

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

https://src-bin.com


Answer #1

Кажется, что вы не правильно обрабатываете ресурсы (переменные, файлы изображений и т. Д.), А также создаете утечку памяти в своем приложении.

вы можете найти здесь, в этом блоге Автор Johan по обработке утечек памяти в вашем приложении или видит этот ВОПРОС.

Избегайте утечек памяти на Android

Если утечка памяти генерируется в библиотеке c ++, вы можете легко найти ресурс, который пропускает память в режиме отладки.

После результата результата вы должны вызвать сборщик мусора, как это было предложено Grisgram, и закрыть любые неиспользуемые ресурсы.

Было бы хорошо, если бы вы могли предоставить трассировку стека в вопросе.


Answer #2

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

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


Answer #3

Я хотел добавить что-то к ответу Али786.

Intent Services на самом деле не лучший выбор для того, что будет повторяться. При следующем вызове службы он переходит в очередь. Настраиваемые службы работают как HandlerThreads. У них есть свои MessageQueue, и после того, как вы запустите сервис с Intent, он будет ждать предыдущего.

Обычные службы, которые запускаются в потоке пользовательского интерфейса, работают параллельно.

Я не уверен, что вы делаете что-то после того, как вы отправите информацию анализа на вашу деятельность, но если вы это сделаете, служба намерения не умрет, а следующей придется ждать. Интеллектуальные услуги не являются лучшим выбором для общения с вашим потоком пользовательского интерфейса, Asynctask может быть лучше в вашем случае. Если вы дадите нам дополнительную информацию (код), возможно, мы сможем дать вам более точный ответ. Надеюсь это поможет!





android-camera2