Мне интересно, какие именно ситуации вызывают сборку Full Garbage Collection на Java.Что вызывает полную сборку мусора в Java?
Очевидными из них являются:
- Запуск из старого ген
- Закончились завивки поколения
- Вызов System.gc()
Что о других случаях, которые вызывают полное дс? В частности:
- Недостаточно свободного места в Survivor Space для копирования объектов из Eden.
- Незначительные коллекции не могут справиться с темпом распределения новых объектов (не знаю, как это сделать).
Я запускаю Sun Java 1.6 и использую Concurrent Mark-Sweep и ParNew для нового поколения.
Как предполагает Чин Бун, ни один из этих «очевидных» не обязательно приведет к полному GC, он полностью зависит от того, как работает активный алгоритм сбора мусора. В частности, я понимаю, что многие сборщики мусора более или менее игнорируют 'System.gc()'. (И не забывайте, что даже для GC-алгоритма даже не существует концепции «полной коллекции» - это может показаться надуманным, но я не видел [сборщик G1] (http: // www .oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html) делают это в наших приложениях.) –
Как вы думаете, JVM с G1 делает, когда заканчивается куча пространства? Продолжайте выделять? Он должен остановить все, пока не сможет освободить память. Существует переключатель, который явно отключает подсказку System.gc(), но я не видел, чтобы CMS или G1 игнорировали его по умолчанию. –
Я думаю, это зависит от того, как вы определяете «полную коллекцию» - я не считаю, что это термин первого класса в контексте спецификации JLS или VM. Значение будет зависеть от конкретного алгоритма GC, который вы используете, и может даже не иметь смысла для данного GC impl. То, что я пытался указать, состоит в том, что единственный возможный общий ответ - «это зависит», со всеми другими особенностями, отложенными к внутренним частям конкретного сборщика мусора. –