gpt4 book ai didi

java - 如何防止 Java 超出容器内存限制?

转载 作者:搜寻专家 更新时间:2023-11-01 01:59:52 24 4
gpt4 key购买 nike

我在硬内存限制为 4GB 的 Docker 容器中运行 Java 程序。我已将最大堆设置为 3GB,但 Java 程序仍然超出限制并被杀死 (OOMKilled)。

我的问题是:我如何配置 Java 以遵守设置的容器限制并抛出 OutOfMemoryException 而不是尝试分配超出限制并被主机内核踢屁股?

更新:我是一名经验丰富的 Java 开发人员,对 JVM 有一定的了解。我知道如何设置最大堆,但我想知道是否有人知道一种方法可以限制 JVM 进程从操作系统请求的内存。

最佳答案

当 Java 应用程序在容器内执行时,JVM 人机工程学(负责根据主机的能力动态分配资源)并不知道它在容器内运行,它会计算要使用的资源数量基于执行容器的主机的 Java 应用程序。鉴于此,如果您对容器设置限制并不重要,JVM 将以您主机的资源为基础进行计算。

从 JDK 8u131+ 和 JDK 9 开始,有一个实验性 VM 选项允许 JVM 人体工程学从 CGgroups 读取内存值。要启用它,您必须将以下标志传递给 JVM:

-XX:+UnlockExperimentalVMOptions and -XX:+UseCGroupMemoryLimitForHeap

如果您启用这些标志,JVM 将知道它正在容器内运行,并使 JVM 人体工程学根据容器限制而不是主机的能力计算应用程序的资源。

启用标志:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -jar app.jar

您可以使用 ENV 变量将 JVM 选项动态传递给您的容器。

例子:

运行您的应用程序的命令类似于:

 $ java ${JAVA_OPTIONS} -jar app.jar

docker run 命令需要像这样传递 ENV 变量:

$ docker run -e JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap" myJavaImage

希望这对您有所帮助!

关于java - 如何防止 Java 超出容器内存限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52040939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com