I'm Koala

I'm Koala

K8s中对 Java app 的内存进行限制

k8s
6
2026-08-25

背景

K8s根据各app的内存配置以调度到合适的node节点,具体的调度策略过于复杂,可搜索引擎之,但主要是根据Deployment文件中指定的limit和request进行调度。

如果没有合理设置内存值,当部署新的app时,k8s并不知道此app将消耗多少资源,于是会根据内置调度策略将其部署到某个node节点上,假如调度Node的剩余可用内存仅有1G,而新部署的app在运行后最少也需要 1.5G,待此 app 运行后将引发整个Node的OOM。

因此,合理配置各app的内存极其重要。

内存限制

K8s 中的限制

在app的配置文件里,container节点下,增加下面的配置:

resources: 

    limits:   

        memory: 30Mi 

    requests:   

        memory: 30Mi

其中limits是内存限制,当容器所需内存超过此值时,容器将OOM被重启。

requests是内存请求,也就是所需内存,或者说为容器预留的内存,K8s主要根据此值为容器选择node节点。例如requests中的memory值为1G,node01的可用内存为2G,node02的可用内存为800M,则此时app将被调度到node01上。

根据上述原理可知,limits应当大于等于requests,而requests应当基本接近app运行过程中所需的内存大小,类似于JVM的内存优化,所需内存和最大内存建议保持一致。

JVM限制

JAVA_OPTS环境变量中增加下列参数:

  • -Xmx:JVM运行时的最大内存限制。

  • -Xms:JVM运行时的初始内存大小。

  • -Xmn:年轻代大小。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

  • -Xss:jvm启动的每个线程分配的内存大小。

  • 0