Использование памяти Java увеличивается, когда используется приложение, но не уменьшается, когда оно не используется. - PullRequest
10 голосов
/ 11 июня 2010

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

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

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

Ответы [ 5 ]

7 голосов
/ 11 июня 2010

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

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

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

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

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

enter image description here

2 голосов
/ 11 июня 2010

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

1 голос
/ 11 июня 2010

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

0 голосов
/ 11 июня 2010

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

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

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

0 голосов
/ 11 июня 2010

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

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

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

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