2017-01-05 2 views
1

Я пытаюсь сохранить полученные фреймы от камеры в хеш-таблицу для последующего использования в приложении Android.Удалить элемент таблицы hash не освобождает память

1. Receive Frame (data of type byte []) 
2. I just have a counter variable increased each frame received. 
3. Using counter variable i keep in the Hash Table along with 'data'. 
4. If i reach the counter > 100, then i start deleting from the beginning. 

Таким образом, это некий фиксированный размер хеш-таблицы.

Я пробовал с кодом ниже.

Callback -> Received 'data' 
counter++; 
myHashTable.put(counter, data.clone()); 

if (counter > 100) { 
    byte [] b = (byte[]) myHashTable.get(counter-100); 
    //use 'b' for some other purpose. 
    myHashTable.remove(counter-100); 

    } 

Мои наблюдения

Я проверил использование памяти приложения, оно продолжает расти, и через какое-то время, получающего исключение ООМ. Что я делаю не так ? Я проверил в мониторинге использования памяти студии Studio.

Ниже ошибка:

01-04 22:54:55.232 7966-7999/sample.app.com E/art: Throwing OutOfMemoryError "Failed to allocate a 460812 byte allocation with 216448 free bytes and 211KB until OOM" 
+0

Что вы используете 'b', если вы говорите:« Используйте 'b' для каких-то других целей»? Если что-то держит эту ссылку на 'b', она не может быть собрана мусором. –

+1

Обратите внимание, что 'byte [] b = (byte []) myHashTable.remove (counter-100);' будет проще, чем получать и удалять отдельно. –

+0

Почему бы просто не сбросить счетчик, когда вы доберетесь до 100, чтобы перезаписать старый контент? – SkyDream

ответ

0

я думаю, что простое решение, которое вы не устанавливать счетчик в 0, когда он достигает> 100 добавить внутри, если() {счетчик = 0} вот это я предполагаю так как это бесконечный цикл попробуйте отладить его, добавив инструкцию печати и найдите свою консоль.

+0

okk @skydream уже получил эту приятную работу – vic

Смежные вопросы