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

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

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

Спасибо

-edit -

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

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

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

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

java -Xmx1024M YourClass

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

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

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

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

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

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

+15
19 июл. '11 в 17:58
источник

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

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

+11
19 июл. '11 в 14:37
источник

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

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

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

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

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

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

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

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

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

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

+2
19 июл. '11 в 14:06
источник

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

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

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

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

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

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

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

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

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