当前位置: 代码迷 >> 综合 >> 正确设置Java内存防止容器OOM Killer
  详细解决方案

正确设置Java内存防止容器OOM Killer

热度:85   发布时间:2023-12-07 04:22:22.0

在使用Java的容器上警察发生量重启,Docker检查发现pod被OOMKiller代码杀死:137。究其原因还是因为老版java不能正确处理容器的资源限制。

JVM默认的最大Heap大小是系统内存的1/4。但在java 的早期版本中(小于1.8.131),不支持读取cgroup的限制。 默认是从/proc/目录读取可用内存。但是容器中的/proc目录默认是挂载的宿主机的内存目录。即java 读取的到可用的内存是宿主机的内存。那么自然会导致进程超出容器limit 限制的问题。

  • 方法1:获取容器内存限制,在启动参数中设置堆内存大小
    详见:https://yq.aliyun.com/articles/18037
#!/bin/bash
limit_in_bytes=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)# If not default limit_in_bytes in cgroup
if [ "$limit_in_bytes" -ne "9223372036854771712" ]
thenlimit_in_megabytes=$(expr $limit_in_bytes \/ 1048576)heap_size=$(expr $limit_in_megabytes - $RESERVED_MEGABYTES)export JAVA_OPTS="-Xmx${heap_size}m $JAVA_OPTS"echo JAVA_OPTS=$JAVA_OPTS
fiexec catalina.sh run
  • 方法2:在8u131和9以后使用以下标志允许JVM基于容器限制进行垃圾收集
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

实质还是从memory.limit_in_bytes获取限制

参考文章:

https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/82599380
https://yq.aliyun.com/articles/18037
https://www.jdon.com/51409
https://www.cnblogs.com/itanony/p/11037470.html
https://segmentfault.com/a/1190000013945253

  相关解决方案