Java 8/9 a apporté son soutien pour l' -XX:+UseCGroupMemoryLimitForHeap
(avec -XX:+UnlockExperimentalVMOptions
). Ce jeux, -XX:MaxRAM
de la cgroup limite de mémoire. Par défaut, la JVM alloue environ 25% de la RAM max, car -XX:MaxRAMFraction
4 par défaut.
Exemple:
MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m
À l'aide de seulement 25% du quota semble comme des déchets pour un déploiement qui (généralement) se compose d'un unique processus de JVM. Alors maintenant, les gens se fixent -XX:MaxRAMFraction=1
, de sorte que la JVM est théoriquement autorisé à utiliser 100% de l'MaxRAM.
Pour le 1g exemple, cela se traduit souvent dans les tailles de tas autour de 900m. Cela semble un peu élevé - il n'y a pas beaucoup de place libre pour la JVM ou d'autres choses comme la distance des coquilles ou des tâches de processus.
Est ce que cette configuration (-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1
) considérés comme sûrs pour la prod ou même les meilleures pratiques? Ou dois-je encore ramasser -Xmx
, -Xms
, -Xss
et ainsi de suite?