繁体   English   中英

如果Java堆内存限制与kubernetes中的pod资源限制不同,会发生什么?

[英]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............
  1. 如果java进程达到其最大堆限制(即1600m(Xmx1600m))会发生什么
  2. 如果Xmx对pod内的java进程没有影响,它可以直接进入pod限制(即内存:2500Mi的限制部分)
  3. 如果上面的配置是正确的,那么我们正在浪费900Mi的内存(2500-1600 = 900)

-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM