2012-03-03 2 views
21

Мне интересно, какие именно ситуации вызывают сборку Full Garbage Collection на Java.Что вызывает полную сборку мусора в Java?

Очевидными из них являются:

  • Запуск из старого ген
  • Закончились завивки поколения
  • Вызов System.gc()

Что о других случаях, которые вызывают полное дс? В частности:

  • Недостаточно свободного места в Survivor Space для копирования объектов из Eden.
  • Незначительные коллекции не могут справиться с темпом распределения новых объектов (не знаю, как это сделать).

Я запускаю Sun Java 1.6 и использую Concurrent Mark-Sweep и ParNew для нового поколения.

+0

Как предполагает Чин Бун, ни один из этих «очевидных» не обязательно приведет к полному GC, он полностью зависит от того, как работает активный алгоритм сбора мусора. В частности, я понимаю, что многие сборщики мусора более или менее игнорируют 'System.gc()'. (И не забывайте, что даже для GC-алгоритма даже не существует концепции «полной коллекции» - это может показаться надуманным, но я не видел [сборщик G1] (http: // www .oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html) делают это в наших приложениях.) –

+0

Как вы думаете, JVM с G1 делает, когда заканчивается куча пространства? Продолжайте выделять? Он должен остановить все, пока не сможет освободить память. Существует переключатель, который явно отключает подсказку System.gc(), но я не видел, чтобы CMS или G1 игнорировали его по умолчанию. –

+0

Я думаю, это зависит от того, как вы определяете «полную коллекцию» - я не считаю, что это термин первого класса в контексте спецификации JLS или VM. Значение будет зависеть от конкретного алгоритма GC, который вы используете, и может даже не иметь смысла для данного GC impl. То, что я пытался указать, состоит в том, что единственный возможный общий ответ - «это зависит», со всеми другими особенностями, отложенными к внутренним частям конкретного сборщика мусора. –

ответ

4

Я наблюдал еще одну ситуацию, которая вызывает полную GC в Java HotSpot VM 1.6 64bit на Ubuntu, используя Concurrent Mark-развертку:

Если -XX: значение PermSize не равна -XX: MaxPermSize (например, меньше), случайный полный GC происходит, когда java необходимо расширить PermGen (хотя ему не нужно выделять больше памяти, чем MaxPermSize). Таким образом, настройка -XX: PermSize и -XX: MaxPermSize - это то же самое, что и хорошая идея.

+0

Как это принято? PermGenSpace не влияет на полный gc. Вы имеете в виду параметры xmx и xms? – Amareswar

+0

@Amareswar Oracle говорит: «Постоянное поколение включено в полную сборку мусора» – Gamby

2

Это очень зависит от ваших параметров jvm и jvm, которые вы используете.

По этой причине я рекомендую вам взглянуть на книгу «Производительность Java» bý John and Hunt.

+1

Должно быть некоторые общие правила, хотя, по крайней мере, для реализации JVM и сборщика мусора. –