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

У меня есть JAVA-приложение, которое использует большую память при использовании, но когда программа не используется, использование памяти не понижается.

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

System.gc не работает.

10
задан gren 11 June 2010 в 11:48
поделиться

5 ответов

Как указано в комментариях, нет уверенности в том, что, хотя сборщик мусора удаляет объекты, он возвращает память системе.

Возможно, Настройка схемы сборки мусора предоставит решение вашей проблемы:

По умолчанию JVM увеличивает или уменьшает размер кучи на каждом сборщике мусора, чтобы сохранить соотношение свободного места к живым объектам в каждой коллекции внутри указанный диапазон.

  • -XX: MinHeapFreeRatio - когда процент свободного пространства в поколении падает ниже этого значения, поколение будет расширено, чтобы соответствовать этому проценту. По умолчанию 40
  • -XX: MaxHeapFreeRatio - когда процент свободного пространства в поколении превышает это значение, поколение сжимается, чтобы соответствовать этому значению. По умолчанию 70

. В противном случае, если вы подозреваете, что происходит утечка ссылок, вы можете выяснить, как, какие объекты и где происходят утечки, - это отслеживать кучу в JVisualVM (инструмент, связанный со стандартным SDK). С помощью этой программы вы можете выполнить дамп кучи и получить гистограмму потребления памяти объектами:

enter image description here

7
ответ дан 4 December 2019 в 01:29
поделиться

Рассматривали ли вы использование профилировщика памяти? Если у вас нет доступа к одному из них, вы можете начать с захвата связки jmap -histo и написания сценария для определения различий.

1
ответ дан 4 December 2019 в 01:29
поделиться

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

2
ответ дан 4 December 2019 в 01:29
поделиться

System.gc не имеет никаких гарантий относительно того, должна ли она освобождать память при выполнении. См. Почему вызов System.gc() - плохая практика?

Попробуйте уменьшить Xmx JVM arg, если он установлен на большое значение, и посмотрите в JConsole, что происходит с использованием памяти и активностью GC. Обычно вы увидите картину в виде зубьев пилы.

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

0
ответ дан 4 December 2019 в 01:29
поделиться

Происходит одно из двух:

1) В вашем приложении происходит утечка ссылок. Вы уверены, что не держитесь за объекты, когда они вам больше не понадобятся? Если да, то Java должна хранить их в памяти.

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

0
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: