[英]what happens if the java heap memory limits is different than the pod resource limits in kubernetes?
我正在使用以下配置在吊舱内运行弹簧靴。
Pod限制:
resources:
limits:
cpu: "1"
memory: 2500Mi
requests:
cpu: "1"
memory: 2500Mi
命令args:
spec:
containers:
- args:
- -c
- ln -sf /dev/stdout /var/log/access.log;java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false -Djava.security.egd=file:/dev/./urandom
-Xms1600m -Xmx1600m -XX:NewSize=420m -XX............
-Xmx标志仅控制Java堆内存,这是运行代码时可用于自己的Java对象的空间。 如果你用完了,JVM会做垃圾收集来腾出空间。 如果仍然用完,则会抛出OutOfMemoryException。
Java JVM还在内部使用了一堆其他内存来加载类,JIT编译等...因此,您需要在Kubernetes中允许更多内存而不仅仅是-Xmx值。 如果超过Kubernetes限制值,那么Java可能会崩溃。
您在上面发布的配置看起来很好。 通常我会在运行一段时间后无限制地查看Kubernetes内存使用情况图来找到这些值。
如果在docker中运行JVM,而不是手动设置-Xmx
, -Xms
选项,最好使用-XX:+ UnlockExperimentalVMOptions -XX:+ UseCGroupMemoryLimitForHeap告诉JVM遵守容器的限制。
请参阅https://hub.docker.com/_/openjdk/ 使JVM尊重CPU和RAM限制以获取更多信息。
如果java进程已达到其最大堆限制,那么如果在GC之后它无法重新获得堆内存,那么jvm将抛出outofmemory错误。 在这种情况下,pod将运行但java进程出错。
Xmx对POD内的jvm堆有影响,jvm堆不能超过它。 在你的情况下,jvm堆可能会增加,因为pod的内存相对较高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.