Удаление части массива в Java для освобождения памяти в куче - PullRequest
1 голос
/ 30 апреля 2010

Я реализую алгоритм динамического программирования для задачи о ранце в Java. Я объявляю массив, а затем инициализирую его размер [количество объектов] [вместимость рюкзака].

Когда мое количество объектов или емкость становятся слишком большими, я получаю ошибку памяти, потому что у меня недостаточно места в куче. Мои вопросы: если я удаляю строки из моего двойного массива по мере продвижения, освободит ли Java память при удалении? Или Java резервирует это пространство памяти для размера массива, который я первоначально создал? Если это последнее, есть ли способ вручную освободить память в Java?

Спасибо за вашу помощь!

Ответы [ 4 ]

5 голосов
/ 30 апреля 2010

Короткий ответ «да» - если вы используете массивы, подобные этому:

private void foo () {
  int[][] bar = new int[10][10];
  bar[1] = null;  
  //at this point, the array that was in bar[1] is eligible for garbage collection
  //unless someone else has a reference to it
}
1 голос
/ 01 мая 2010

невозможно освободить память из части массива ... потому что в Java вы не можете удалять элементы из массива. Вместо этого вы можете переместить этот массив и затем сохранить в другой массив требуемого размера ... .

1 голос
/ 30 апреля 2010

Да, это работает. Java не имеет многомерных массивов, а только зубчатые массивы (массивы массивов). Таким образом, первый массив - это всего лишь массив указателей на реальные массивы содержимого.

Это имеет положительный эффект, когда всякий раз, когда вы назначаете новый массив одной из зубчатых областей, старая может быть собрана сборщиком мусора. (см. ответ Sbodd для примера)

1 голос
/ 30 апреля 2010

Это должно освободить память немного позже, необязательно, когда вы удаляете строки. Однако он будет использовать эту память для новых данных.

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

java -Xmx128m you.app.Main

Это запустит ваше приложение с 128 МБ ОЗУ.

...