Как освободить память на Java?

Существенно - нет. Это почти так легко, как это добирается. Вы могли бы переписать его немного более короткий/более чистый, но идея будет тем же. Это - то, как я записал бы его:

$c = true; // Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
    echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
135
задан Felix 14 October 2009 в 17:58
поделиться

4 ответа

Java использует управляемую память, поэтому единственный способ выделить память - использовать оператор new , и единственный способ освободить память - это использовать сборщик мусора.

Этот технический документ по управлению памятью (PDF) может помочь объяснить, что происходит.

Вы также можете позвонить по телефону System.gc () , чтобы предложить немедленно запустить сборщик мусора. Однако окончательное решение принимает среда выполнения Java, а не ваш код.

Согласно документации Java ,

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

92
ответ дан 23 November 2019 в 23:47
поделиться

Кажется, никто не упомянул явную установку ссылок на объекты на null , что является допустимым методом «освобождения» памяти, который вы, возможно, захотите рассмотреть.

Например, , скажем, вы объявили List в начале метода, который увеличился в размере до очень большого размера, но требовался лишь до середины выполнения метода. На этом этапе вы можете установить для ссылки List значение null , чтобы позволить сборщику мусора потенциально вернуть этот объект до завершения метода (и ссылка в любом случае выпадает из области видимости).

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

64
ответ дан 23 November 2019 в 23:47
поделиться
System.gc(); 

Запускает сборщик мусора.

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

Не рекомендуется.

Изменить: Я написал исходный ответ в 2009 году. Сейчас 2015.

Сборщики мусора постоянно улучшаются за ~ 20 лет существования Java. На этом этапе, если вы вручную вызываете сборщик мусора, вы можете рассмотреть другие подходы:

  • Если вы принудительно используете сборщик мусора на ограниченном количестве машин, возможно, стоит установить точку балансировки нагрузки далеко от текущей машины, ожидание завершения обслуживания подключенных клиентов, тайм-аут после некоторого периода зависания соединений, а затем просто перезапуск JVM. Это ужасное решение, но если вы смотрите на System.gc (), принудительный перезапуск может быть возможным временным решением.
  • Рассмотрите возможность использования другого сборщика мусора. Например, коллектор G1 (новый за последние шесть лет) - это модель с малой паузой; в целом он использует больше ЦП, но старается никогда не останавливать выполнение принудительно. Поскольку теперь почти все серверные процессоры имеют несколько ядер, это действительно хороший компромисс.
  • Посмотрите на свои флаги, настраивающие использование памяти. Если у вас не так много постоянно работающих объектов, особенно в новых версиях Java, рассмотрите возможность увеличения размера newgen в куче. newgen (молодой) - это место, где размещаются новые объекты. Для веб-сервера все, что создано для запроса, помещается сюда, и если это пространство слишком мало, Java будет тратить дополнительное время на обновление объектов до долговременной памяти, где их уничтожить дороже. (Если newgen немного маловат, вы заплатите за него.) Например, в G1:
    • XX: G1NewSizePercent (по умолчанию 5; вероятно, не имеет значения.)
    • XX: G1MaxNewSizePercent (по умолчанию 60; возможно, увеличьте это.)
  • Вы можете сообщить сборщику мусора, что вы не согласны с более длинным Пауза. Это приведет к более частому запуску сборщика мусора, чтобы позволить системе сохранить остальные ограничения. В G1:
    • XX: MaxGCPauseMillis (по умолчанию 200).
22
ответ дан 23 November 2019 в 23:47
поделиться

Если вы действительно хотите выделить и освободить блок памяти, вы можете сделать это с помощью прямых ByteBuffers. Есть даже непереносимый способ освободить память.

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

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

3
ответ дан 23 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

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