Javadoc для System.gc()
и Runtime.gc()
указывает на тот факт, что можно настроить JVM для игнорирования вызовов этих методов;например, с использованием опции -XX:+DisableExplicitGC
JVM.
Однако они не настроены таким образом по умолчанию (по крайней мере, в текущих версиях Oracle и OpenJDK Java).Таким образом, вызовы будут делать что-то по умолчанию.
Сказав это, в большинстве случаев плохая идея вызывать сборщик мусора напрямую.В тех немногих случаях, когда это оправдано, в основном рассматриваются следующие вопросы:
, если вы пытаетесь исследовать или тестировать поведение кода, чувствительного к ГХ;например, финализаторы
, если вы пытаетесь избежать паузы ГХ в неудобной точке, запустив ГХ в точке, где пользователь не заметит.
Я не понимаю, что плохого в предоставлении гарантированного GC, когда я запрашиваю System.gc()
?
Когда вы можете вызывать сборщик мусора черезgc()
вызов, обычно делает полную коллекцию.Это дорого, особенно если объем данных без мусора велик 1 .К сожалению, многие программисты на Java этого не понимают.Итак, (насколько я понимаю) основная причина, по которой опция JVM игнорирует явные вызовы gc()
, состоит в том, чтобы смягчить потенциально катастрофическое влияние на производительность программистов , злоупотребляющих методом.
Если вы do , чтобы ваши System.gc()
вызовы вызывали GC, лучший совет - не включайте -XX:+DisableExplicitGC
в параметры JVM.
Прочтите руководство Oracle.для команды java
для получения дополнительной информации.
1 - Большая часть времени выполнения сборки мусора заключается в отслеживании и копировании графа объектов, которые все еще доступны.Если вы скажете сборщику запустить его до того, как он понадобится, вы снизите его эффективность.Напротив, сама JVM знает, когда куча заполнена или достаточно близка, чтобы гарантировать сбор.Действительно, он может оптимизироваться для двух разных требований;максимизация пропускной способности или минимизация времени паузы ГХ.