Пустое пространство Java из памяти

Мое приложение в настоящее время потребляет довольно много памяти, поскольку оно управляет физическими симуляциями. Проблема в том, что последовательно, при 51-м моделировании, java будет вызывать ошибку, обычно из-за нехватки памяти из-за нехватки памяти (моя программа в конечном итоге запускает тысячи симуляций).

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

Спасибо

-edit -

Спасибо, ребята. Оказывается, программное обеспечение симулятора не очищало информацию после каждого прогона, и у меня были все прогоны, хранящиеся в arraylist.

40
19 июля '11 в 17:03
источник поделиться
9 ответов

Невозможно динамически увеличивать кучу программно, так как куча выделяется при запуске виртуальной машины Java.

Однако вы можете использовать эту команду

java -Xmx1024M YourClass

чтобы установить память на 1024

или вы можете установить min max

java -Xms256m -Xmx1024m YourClassNameHere
33
19 июля '11 в 17:11
источник

Если вы используете много памяти и сталкиваетесь с утечками памяти, вы можете проверить, используете ли вы большое количество ArrayList или HashMap со многими элементами.

An ArrayList реализуется как динамический массив . Исходный код Sun/Oracle показывает, что когда новый элемент вставляется в полный ArrayList, создается новый массив размером в 1,5 раза от исходного массива, а элементы копируются. Это означает, что вы можете тратить до 50% пространства в каждом используемом ArrayList, если только вы не назовете его метод trimToSize. Или еще лучше, если вам известно количество элементов, которые вы собираетесь вставить перед началом, затем вызовите конструктор с начальной емкостью в качестве аргумента.

Я не очень внимательно изучил исходный код для HashMap, но на первый взгляд кажется, что длина массива в каждом HashMap должна быть степенью двух, что делает ее еще одной реализацией динамического массива. Обратите внимание, что HashSet по существу является оберткой вокруг HashMap.

15
19 июля '11 в 20:58
источник

Существуют различные инструменты, которые можно использовать для диагностики этой проблемы. JDK включает JVisualVM, который позволит вам подключиться к вашему запущенному процессу и показать, какие объекты могут выходить из-под контроля. У Netbeans есть обертка вокруг, которая работает достаточно хорошо. Eclipse имеет анализатор памяти Eclipse, который я использую чаще всего, просто кажется, что обрабатывает большие файлы дампов немного лучше. Также есть опция командной строки, -XX: + HeapDumpOnOutOfMemoryError, которая даст вам файл, который в основном представляет собой моментальный снимок вашей памяти процесса при сбое вашей программы. Вы можете использовать любой из вышеперечисленных инструментов, чтобы посмотреть на него, это может действительно помочь в диагностике таких проблем.

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

11
19 июля '11 в 17:37
источник

Я также столкнулся с той же проблемой. Я решил выполнить сборку, выполнив следующие шаги:

- > Щелкните правой кнопкой мыши на проекте, выберите RunAs → Run configurations

Выберите проект как BaseDirectory. Вместо целей дайте eclipse: eclipse install

- > Во второй вкладке укажите -Xmx1024m как аргументы VM.

5
03 дек. '12 в 15:02
источник

Я хотел бы добавить, что эта проблема похожа на общие утечки памяти Java.

Когда сборщик мусора JVM не сможет очистить "отработанную" память вашего приложения Java/Java EE с течением времени, OutOfMemoryError: Java heap space будет результатом.

Важно сначала выполнить правильную диагностику:

  • Включить verbose: gc. Это позволит вам понять структуру памяти с течением времени.
  • Создайте и проанализируйте JVM Heap Dump. Это позволит вам понять объем памяти приложения и определить источник утечки памяти.
  • Вы также можете использовать профилировщики Java и анализатор утечки памяти во время работы, такие как Plumbr, чтобы помочь вам в этой задаче.
3
25 авг. '13 в 22:05
источник

Попробуйте добавить -Xmx для большей памяти (java -Xmx1024M YourClass) и не забудьте прекратить ссылаться на переменные, которые вам больше не нужны (утечки памяти).

2
19 июля '11 в 17:06
источник

Поддерживаете ли вы ссылки на переменные, которые вам больше не нужны (например, данные из предыдущих симуляций)? Если это так, у вас есть утечка памяти. Вам просто нужно найти, где это происходит, и убедиться, что вы удалите ссылки на переменные, когда они больше не нужны (это произойдет автоматически, если они выйдут из области).

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

1
19 июля '11 в 17:14
источник

Предполагается, что Java очищает пространство кучи, когда все объекты больше не ссылаются. Обычно он не отпустит его обратно в ОС, но он сохранит эту память для собственного внутреннего повторного использования. Возможно, проверьте, есть ли у вас несколько массивов, которые не очищаются или что-то еще.

0
19 июля '11 в 17:06
источник

Нет. Куча очищается сборщиком мусора всякий раз, когда ему кажется. Вы можете попросить его запустить (с System.gc()), но это не гарантируется.

Сначала попробуйте увеличить память, установив -Xmx256m

0
19 июля '11 в 17:06
источник

Посмотрите другие вопросы по меткам или Задайте вопрос