Ответ 1
GC не запускается на основе только значения Xms или Xmx.
Куча = Новое + Старые поколения
Размер кучи (первоначально установленный на Xms) разделен на 2 поколения - Новый (он же Янг) и Старый (ака Тьюринга). Новое поколение по умолчанию 1/3-го от общего размера кучи, а у старого поколения 2/3 от размера кучи. Это можно настроить с помощью параметра JVM под названием NewRatio. Его значение по умолчанию равно 2.
Молодое поколение далее делится на районы Идена и 2 Оставшихся в живых. Соотношение по умолчанию для этих трех пространств: 3/4th, 1/8, 1/8.
Боковое примечание. Речь идет о параллельных сборщиках GC. Для G1 - новый алгоритм GC по-разному делит пустое пространство.
Незначительный GC Все новые объекты выделены в пространстве Eden (кроме массивных, которые хранятся непосредственно в старом поколении). Когда пространство Eden заполняется, запускается Minor GC. Объекты, которые выдержали несколько второстепенных GC, продвигаются до старого поколения (по умолчанию это 15 циклов, которые можно изменить с помощью параметра JVM: MaxTenuringThreshold).
Основной GC В отличие от параллельного коллектора, где Major GC запускается на основе используемого пространства (по умолчанию 70%), параллельные сборщики вычисляют порог на основе 3 целей, упомянутых ниже.
Цели параллельных коллекторов
- Максимальное время паузы GC - Максимальное время, затрачиваемое на выполнение GC
- Пропускная способность - процентное время, затрачиваемое на GC vs Application. По умолчанию (1%)
- След - максимальный размер кучи (Xmx)
Таким образом, по умолчанию Parallel Collector пытается потратить максимум 1% от общего времени работы приложения в Garbage Collection.
Подробнее здесь
Xms to Xmx
Во время запуска JVM создает кучу размера Xms, но резервирует дополнительное пространство (Xmx), чтобы иметь возможность расти позже. Это зарезервированное пространство называется Virtual Space. Обратите внимание, что он просто резервирует пространство и не фиксирует.
2 параметра определяют, когда размер кучи растет (или уменьшается) между Xms и Xmx.
- MinHeapFreeRatio (по умолчанию: 40%). Когда свободное пространство кучи опускается ниже 40%, срабатывает Full GC, а размер кучи увеличивается на 20%. Таким образом, размер кучи может продолжать расти постепенно, пока не достигнет Xmx.
- MaxHeapFreeRatio (по умолчанию: 70%). На оборотной стороне свободное пространство кучи пересекает 70%, затем размер кучи уменьшается на 5% постепенно в течение каждого GC до тех пор, пока он не достигнет Xms.
Эти параметры могут быть установлены во время запуска. Подробнее об этом здесь и здесь.
PS: JVM GC - увлекательная тема, и я бы рекомендовал прочитать эту , чтобы понять ее подробно. Все параметры настройки JVM можно найти здесь здесь.