Удаление части массива в Java для освобождения памяти в куче

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

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

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


person kate    schedule 30.04.2010    source источник


Ответы (4)


Короткий ответ "да" - если вы используете такие массивы:

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
}
person Sbodd    schedule 30.04.2010
comment
Но JVM не вернет эту память в ОС (по крайней мере, не в Windows), но сохранит ее для будущего использования (если я не ошибаюсь, что это то, что нужно OP? - mhh, может быть, нет -) - person OscarRyz; 01.05.2010
comment
Я видел, как JVM возвращает память ОС (Windows XP). Это только когда освобождается большой процент кучи. - person Steve Kuo; 01.05.2010

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

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

java -Xmx128m you.app.Main

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

person OscarRyz    schedule 30.04.2010
comment
Пока он может повторно использовать память для новых данных, я должен быть в порядке. Я хочу иметь возможность добавлять новые строки, когда я удаляю старые строки. Благодарю вас! - person kate; 01.05.2010

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

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

person Foxfire    schedule 30.04.2010

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

person kanwal1986    schedule 01.05.2010