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

k_v*_*ath 3 java heap-memory kubernetes

我正在使用以下配置在 pod 内运行 spring boot。

Pod 限制:

resources:
    limits:
      cpu: "1"
      memory: 2500Mi
    requests:
      cpu: "1"
      memory: 2500Mi
Run Code Online (Sandbox Code Playgroud)

命令参数:

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............
Run Code Online (Sandbox Code Playgroud)
  1. 如果 java 进程已达到其最大堆限制(即 1600m (Xmx1600m))会发生什么
  2. 如果Xmx对pod内部的java进程没有影响,可以上到pod limit right(即内存:limits段的2500Mi)
  3. 如果以上配置正确,那我们就浪费了900Mi的内存权(2500-1600=900)

Hit*_*bat 6

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

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

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