Java 8/9为-XX:+UseCGroupMemoryLimitForHeap(with -XX:+UnlockExperimentalVMOptions)带来了支持.这设置-XX:MaxRAM为cgroup内存限制.默认情况下,JVM分配大约25%的最大RAM,因为-XX:MaxRAMFraction默认值为4.
例:
MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m
Run Code Online (Sandbox Code Playgroud)
仅使用25%的配额似乎是部署的浪费(通常)由单个JVM进程组成.所以现在人们设置了-XX:MaxRAMFraction=1,所以JVM理论上允许使用100%的MaxRAM.
对于1g示例,这通常会导致堆大小约为900米.这似乎有点高 - JVM或其他东西(如远程shell或进程外任务)没有很多空闲空间.
那么这个配置(-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1)被认为是安全的甚至是最佳实践吗?或者我应该还是伸手接-Xmx,-Xms,-Xss等?
XX的默认值是什么:MaxDirectMemorySize?
我正在Kubernetes中运行一个容器化的java应用程序.
为了根据容器规范制作jvm保留存储器,-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap必须设置标志.
如果这两个标志都与Xms和Xmx标志一起设置,那么jvm的行为是什么?一面旗帜会覆盖另一面吗?
例如,如果我们java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xms -Xms2500M -Xmx2500M -jar myjar.jar
在容器中有容量限制4Gi用于请求而4Gi用于响应,则在具有128Gi内存的主机中,JVM会保留多少内存?