首页 > 解决方案 > 如果 java 堆内存限制与 kubernetes 中的 pod 资源限制不同,会发生什么?

问题描述

我正在使用以下配置的吊舱内运行弹簧靴。

吊舱限制:

resources:
    limits:
      cpu: "1"
      memory: 2500Mi
    requests:
      cpu: "1"
      memory: 2500Mi

命令参数:

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)

标签: javakubernetesheap-memory

解决方案


-Xmx 标志仅控制 Java 堆内存,这是运行代码时可供您自己的 Java 对象使用的空间。如果你用完了,JVM 会做垃圾回收来腾出空间。如果仍然用完,则会抛出 OutOfMemoryException。

Java JVM 还在内部使用大量其他内存来加载类、JIT 编译等......因此,您需要在 Kubernetes 中允许更多内存,而不仅仅是 -Xmx 值。如果超过 Kubernetes 限制值,那么 Java 可能会崩溃。

您在上面发布的配置看起来不错。通常我会在无限制运行一段时间后通过查看 Kubernetes 内存使用图来找到这些值。


推荐阅读