UseContainerSupport VM参数有什么作用?

Yan*_*ski 8 java docker

此选项在docker文件中有什么作用?

ENTRYPOINT java -XX:+UseContainerSupport $JAVA_OPTIONS -jar /myapp.jar
Run Code Online (Sandbox Code Playgroud)

如果没有此参数,docker容器会启动吗?我检查了一篇文章

启用内存支持

但我仍然不清楚。

小智 6

是。容器将以开头-XX:+UseContainerSupport

-XX:+UseContainerSupport 用于分配更大部分的内存。

为了防止JVM在容器中运行时调整最大堆大小,请设置 -XX:-UseContainerSupport

除此之外,https://www.eclipse.org/openj9/docs/xxusecontainersupport/可能会有所帮助。

  • 当我阅读-XX:+ UseContainerSupport时,默认情况下它是打开的,因此即使在JDK 10及更高版本上没有它,它也将具有相同的功能。唯一有用的选项是使用-XX:-UseContainerSupport禁用它。但是在那种情况下,JVM将无法观察docker容器设置的限制,它将直接读取整个容器主机的限制,因此与其获取java.lang.OutOfMemoryError:Java堆空间,否则当它碰到容器时,该过程将被残酷地杀死。限制。没有应用程序日志会显示该问题...因此,一句话不要禁用此选项 (2认同)

Thi*_*ago 6

从Java 10开始,此参数(默认情况下已启用)用于使JVM 在分配堆大小(而不是主机配置)时考虑容器内存限制。

该选项已安装到Java 8:https//www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html

例子:

如果您运行:

docker run **-m 1gb** openjdk:8u131 java -XshowSettings:vm -version
Run Code Online (Sandbox Code Playgroud)

结果将是(在我的机器上使用8gb的Ubuntu)

Max. Heap Size (Estimated): 1.68G
Run Code Online (Sandbox Code Playgroud)

我为容器设置了内存限制,但它忽略并使用了主机配置(默认情况下,它使用总内存/ 4)

现在,如果运行具有新功能的版本(上面的链接),您可以看到已考虑容器内存限制:

docker run **-m 1g** openjdk:8u191-jre-alpine java -XshowSettings:vm -version
Run Code Online (Sandbox Code Playgroud)

结果(总内存/ 4):

VM settings:
    Max. Heap Size (Estimated): 247.50M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_191"
Run Code Online (Sandbox Code Playgroud)

在我写openjdk:8图像的最新版本时是222,因此您可以使用此版本,该版本具有背包功能。

想要查询更多的信息:

说明此标志在Java 10中的用法:https : //medium.com/adorsys/jvm-memory-settings-in-a-container-environment-64b0840e1d9e

在Java 8中使用此标志:https : //blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54