В моем приложении много итераций. До сих пор я не сталкивался с проблемами памяти. Но с уровня кода я могу подозревать, что есть несколько мест, которые вызывают утечку памяти и проблемы с памятью. Я думаю о том, чтобы вызвать сборщика мусора вручную. Правильно ли обращаться к сборщику мусора вручную?
Можем ли мы назвать сборщик мусора явно?
Ответ 1
Вы можете вызвать сборщик мусора, используя:
System.gc();
Но это не означает, что он будет выполнен немедленно. JVM решает, когда его выполнять. В общем случае, если JVM собирается выбросить OutOfMemoryError
, вызов System.gc()
не будет препятствовать этому. Лучше исследуйте, почему вы просачиваете столько памяти и очищаете ее по пути.
JavaDoc
Вызов метода gc предполагает, что виртуальная машина Java расходует усилия по утилизации неиспользуемых объектов, чтобы сделать память они в настоящее время доступны для быстрого повторного использования. Когда управление возвращается от вызова метода виртуальная машина Java приложила все усилия для возврата пространства от всех отброшенных объектов
Ответ 2
Можно ли вручную вызвать сборщик мусора вручную?
Нет, это определенно не хорошая практика.
Вы можете использовать System.gc()
. Обратите внимание, что это не гарантирует вызов сборщика мусора - он дает только подсказку системе о том, что было бы неплохо сделать сборку мусора.
Сборщик мусора в Oracle JVM содержит много сложной логики, чтобы определить, когда и что нужно очистить. Для его настройки требуется знание сведений о том, как это работает. Просто размещение System.gc()
где-то в вашей программе вряд ли поможет много, и на самом деле это может даже ухудшить ситуацию.
См. Java SE 6 HotSpot Virtual Machine Tuning Tuning Tuning для получения подробной информации о том, как настроить сборку мусора с помощью Java SE 6.
Ответ 3
Вы можете явно вызвать сборщик мусора, но JVM решает, обрабатывать ли вызов или нет. В идеале вы никогда не должны писать код, зависящий от вызова сборщика мусора.
JVM внутренне использует какой-то алгоритм, чтобы решить, когда делать этот вызов. Когда вы выполняете вызов с помощью System.gc(), это просто запрос JVM, и JVM может в любое время решить игнорировать его.
Ответ 4
Да, вы можете явно вызвать сборщик мусора, используя
System.gc();
Но случается так, что вы не можете заказать JVM для сбора мусора немедленно. JVM самостоятельно решает, когда собирать мусор. Невозможно назвать его вручную.
Кроме того, при использовании OutOfMemoryException
ручной сборки мусора вы не сможете предотвратить исключение, так как JVM выбрасывает это исключение после восстановления всей памяти. У этого есть некоторые очень сложные алгоритмы, чтобы определить, когда и как выполнить сбор мусора.
Поэтому я предлагаю, чтобы, если вы получаете OutOfMemoryException
, перепроверить свою программу, сделать ее более эффективной или увеличить пространство кучи.
Ответ 5
Независимо от того, вы можете или не можете вручную запускать сборщик мусора (и различные уровни сбора) и какое влияние это оказывает на производительность (что действительно является обсуждаемой темой), это не будет препятствовать OutOfMemoryErrors, потому что, когда JVM вот-вот исчерпает память, он в любом случае сделает самую полную коллекцию. Только если после этой коллекции недостаточно памяти, будет ли она ошибочной. Даже если вы запускаете коллекцию раньше самостоятельно, результат (объем исправленной памяти) будет таким же.
Утечки памяти не могут быть исправлены, если вы часто используете сборку мусора.
Они должны быть исправлены в вашей программе (перестать ссылаться на то, что вам больше не нужно раньше) или (в худшем случае, если это "настоящая" утечка) в JVM или самой библиотеке времени выполнения (но подлинное управление памятью ошибки не должны существовать больше после стольких лет службы).
Ответ 6
Calling System.gc() не гарантирует GC. Мусор собирается, если есть реальная потребность в памяти.
Здесь вы можете посмотреть разные сборщики мусора.
http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html
Вы можете включить любой из этих GC в параметры командной строки в соответствии с вашими потребностями.