Java 8/9 предоставила поддержку для -XX:+UseCGroupMemoryLimitForHeap
(с -XX:+UnlockExperimentalVMOptions
). Это устанавливает -XX:MaxRAM
для ограничения памяти группы. По умолчанию JVM выделяет примерно 25% максимальной ОЗУ, потому что -XX:MaxRAMFraction
умолчанию -XX:MaxRAMFraction
4.
Пример:
MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m
Использование только 25% квоты кажется пустой для развертывания, которое (как правило) состоит из одного процесса JVM. Итак, теперь люди устанавливают -XX:MaxRAMFraction=1
, поэтому JVM теоретически разрешено использовать 100% MaxRAM.
Для примера 1g это часто приводит к размерам кучи около 900 м. Это кажется немного большим - нет свободного места для JVM или других вещей, таких как удаленные оболочки или задачи вне процесса.
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1
так же эта конфигурация (-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1
) считается безопасным для prod или даже лучшей практики? Или мне еще нужно выбрать -Xmx
, -Xms
, -Xss
и так далее?