2015-09-22 3 views
3

Я борюсь с некоторыми концепциями сбора/выделения мусора в Java. Я буду использовать приведенный ниже пример, чтобы проиллюстрировать мое недоразумение.Понимание сборки мусора в java

У меня есть приложение для Android, где я собираю данные от датчиков и сохраняю значения в массиве, который никогда не превышает N выборок. Используя Android Studio, я могу смотреть живой просмотр Free vs Allocated memory. Когда мое приложение запускается, я могу наблюдать, как выделенная память медленно увеличивается (и уменьшается свободная память). Когда свободная память приближается к 0, система запускает сборку мусора, и я вижу значительное выделение памяти. Иногда, когда свободная память приближается к 0, система будет делать сборку мусора, которая увеличит выделенную память, но также увеличит издержки памяти.

1) Если выделенная память падает до «исходных уровней», когда выполняется сбор мусора, это означает, что у меня нет утечки памяти? Я понимаю, что утечка памяти означает, что сбор мусора не сможет освободить выделенную память.

2) Увеличивает ли тот факт, что выделенная память продолжает расти, даже если размер массива ограничен N образцами, что указывает на то, что я делаю ненужное выделение в своем приложении? Когда массив попадает в N выборок, я делаю array.remove (0) до выполнения array.add(). Я бы подумал, что после того, как N выборок будет в массиве, выделенная память не будет продолжать увеличиваться.

+0

Чтобы узнать, что именно выделяется, попробуйте https://developer.android.com/tools/performance/allocation-tracker/index.html. – fadden

ответ

3
  1. Вы правы.
  2. №. Каждый раз, когда вы создаете новый образец, вам нужна память, и память распределяется таким образом. Затем вы удаляете старый образец, в котором используется память. Эта память не восстанавливается немедленно. Он только возвращается, когда сбор мусора решает запустить. Именно тогда вы видите уменьшение выделенной памяти.
Смежные вопросы