В моем приложении есть долгосрочное задание (до 10-15 минут), в течение которого приложение передает большой объем данных (до 16 МБ) с устройства BLE.
ТекущийРеализация использует RxAndroidBle для асинхронного выполнения передачи, что происходит с помощью опции характеристики NOTIFY
BLE - приложение подписывается на характеристику и запрашивает данные для передачи, и устройство BLE начинает отправлять пакеты, содержащие данные. Благодаря решению NOTIFY
(сервер, в нашем случае устройство BLE, будет повторять пакеты, которые не получают подтверждение о том, что оно было получено), мне не нужно заботиться ни о чем, кроме постоянного хранения полученных пакетов.
На данный момент это решается путем увеличения обычного ByteArray
(проект находится в Котлине) через
data += received
Однако во время такой передачи около 6 МБОтметим, что доступная оперативная память для приложения падает ниже 20% в соответствии с журналами GC и постепенно уменьшается примерно до 10-12% к моменту передачи 8 МБ. Я не пробовал с более крупной партией, поскольку что-то большее довольно редко встречается на данном устройстве, но это может произойти.
Я пытался заменить ByteArray
на предварительно выделенный ByteBuffer
, однако в соответствиисообщения GC, это не значительное улучшение.
Есть что-нибудь, что можно попробовать здесь, чтобы оптимизировать назначение данных, или есть вероятность, что причина падения памяти находится где-то еще?