Docker中UseContainerSupport为什么不起作用?

what 发表于: 2023-12-27   最后更新时间: 2023-12-27 15:27:45   980 游览

Docker版本:

# docker -v
Docker version 24.0.7, build afdd53b

kubernetes的版本:

# kubectl version
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.14", GitCommit:"a5967a3c4d0f33469b7e7798c9ee548f71455222", GitTreeState:"clean", BuildDate:"2023-09-13T09:12:09Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7

jvm配置:

# java -XX:+UseContainerSupport -XX:+PrintCommandLineFlags -version

我容器限制的是Limit 1G,返回的是物理机15G的,不是限制后的:

-XX:InitialHeapSize=261956608 -XX:MaxHeapSize=4191305728 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseContainerSupport -XX:+UseParallelGC 
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
# java -XX:+UseContainerSupport -XshowSettings:vm -version
VM settings:
    Max. Heap Size (Estimated): 3.47G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) 64-Bit Server VM

java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

我原来是好的,在新环境不行了,区别是docker和kubernetes都装的最新的。

发表于 2023-12-27

升级jdk到8u381+,支持新的cgroup v2,就好了。

原因:

cgroup v2 在 Docker engine 20.10 中启用了。这意味着 docker 不再使用 cgroups v1,而是转而使用 cgroups v2。

旧的 Java 版本使用 cgroup v1,这意味着当使用旧的 Java 版本时,仍然使用 cgroup v1,JVM 的内存计算不正确,会导致 Out Of Memory。

what -> 半兽人 10月前

非常感谢,升级了JDK版本就好啦!

你的答案

查看java相关的其他问题或提一个您自己的问题