Что вызывает полную сборку мусора в Java?
Мне интересно, какие именно ситуации вызывают сборку Full Garbage Collection в Java.
Очевидными являются:
- Запуск старого поколения
- Запуск из perm gen
- Calling System.gc()
Как насчет других случаев, вызывающих полный gc? В частности:
- Не хватает свободного места в Survivor Space для копирования объектов из Eden.
- Незначительные коллекции не могут справиться с темпом распределения новых объектов (не знаю, как это сделать).
Я запускаю Sun Java 1.6 и использую Concurrent Mark-Sweep и ParNew для нового поколения.
Ответы
Ответ 1
Я наблюдал еще одну ситуацию, которая запускает полный GC в Java Hotspot VM 1.6 64bit на Ubuntu, используя Concurrent Mark-Sweep:
Если значение -XX: значение PermSize не равно -XX: MaxPermSize (например, меньше), случайный полный GC происходит, когда java необходимо расширить PermGen (хотя ему не нужно выделять больше памяти, чем MaxPermSize).
Поэтому настройка -XX: PermSize и -XX: MaxPermSize одинакова, кажется хорошей идеей.
Ответ 2
Это сильно зависит от ваших параметров jvm и jvm, которые вы используете.
По этой причине я рекомендую вам взглянуть на книгу "Производительность Java" bý John and Hunt.