Java 8/9 支持 -XX:+UseCGroupMemoryLimitForHeap
参数(需要使用-XX:+UnlockExperimentalVMOptions
)。该参数将 -XX:MaxRAM
设置为 cgroup 内存限制值。默认情况下,JVM 将分配最大 RAM 的约25%,因为 -XX:MaxRAMFraction
默认值为 4。
例子:
MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m
仅使用配额的25%似乎对于通常只包含单个JVM进程的部署来说是浪费。因此,现在人们设置-XX:MaxRAMFraction = 1
,因此理论上允许JVM使用最大RAM的100%。
对于1g示例,这通常会导致堆大小约为900m。这似乎有点高 - 没有太多的空闲空间用于JVM或其他诸如远程shell或进程外任务之类的东西。
那么,这种配置(-XX:+ UnlockExperimentalVMOptions -XX:+ UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction = 1
)是否被认为是生产环境中安全的甚至是最佳实践?还是我仍然需要手动选择-Xmx
,-Xms
,-Xss
等参数?