【问题标题】:OpenJDK 1.8.0_242, MaxRAMFraction setting not reflectingOpenJDK 1.8.0_242,MaxRAMFraction 设置未反映
【发布时间】:2020-05-28 13:59:51
【问题描述】:

我在 alpine-OpenJDK 映像中运行 Springboot 应用程序并面临 OutOfMemory 问题。最大堆的上限为 256MB。我尝试将 MaxRAMFraction 设置更新为 1,但没有看到它反映在 Java_process 中。我可以选择将容器内存限制增加到 3000m,但更愿意使用 MaxRamfraction=1 的 Cgroup 内存。有什么想法吗?

Java-Version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (IcedTea 3.15.0) (Alpine 8.242.08-r0)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

bash-5.0$ java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|MaxRAMFraction"
    uintx DefaultMaxRAMFraction                     = 4                                   {product}
    uintx MaxHeapSize                              := 262144000                           {product}
    uintx MaxRAMFraction                            = 4                                   {product}
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (IcedTea 3.15.0) (Alpine 8.242.08-r0)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

Container Resource limits
 ports:
        - containerPort: 8080
          name: 8080tcp02
          protocol: TCP
        resources:
          limits:
            cpu: 350m
            memory: 1000Mi
          requests:
            cpu: 50m
            memory: 1000Mi
        securityContext:
          capabilities: {}

Container JAVA_OPTS screenshot

【问题讨论】:

    标签: java docker kubernetes jvm containers


    【解决方案1】:

    最大堆的上限为 256MB。

    你的意思是通过 docker 中的-m?如果是这样,这不是您指定的 java 堆,而是总内存。

    我尝试将 MaxRAMFraction 设置更新为 1

    MaxRAMFraction 已弃用且未使用,忘记它。

    UseCGroupMemoryLimitForHeap

    已弃用并将被删除。也使用移植到 java-8 的UseContainerSupport

    MaxRAM=2g

    你知道这实际上是做什么的吗?它设置 JVM 认为你拥有的“物理”RAM 的值。

    我假设您在这里没有故意设置-Xms-Xmx?既然你不知道容器会有多少内存?如果是这样,我们就在同一个鞋子里。我们确实知道我们要获得的最小值是1g,但我不知道最大值,因此我不想明确设置-Xms-Xmx

    相反,我们这样做:

    -XX:InitialRAMPercentage=70
    -XX:MaxRAMPercentage=70
    -XX:+UseContainerSupport
    -XX:InitialHeapSize=0
    

    就是这样。这是做什么的?

    InitialRAMPercentage 用于计算初始堆大小,但仅当缺少 InitialHeapSize/Xms 时。 MaxRAMPercentage 用于计算最大堆。不要忘记,java 进程需要的不仅仅是只是 heap,它还需要原生结构;这就是为什么70 (%)。

    【讨论】:

    • 内存上限为 256MB,因为默认情况下 JVM 使用 MaxRAMFraction=4。我的容器有 1024MB 的内存和 256 的 JVM 上限(请参阅相关的截图),我试图通过传递 MaxRAMFraction 1 来覆盖它。我没有意识到它已被弃用和未使用。我会尝试 UseContainerSupport 并回复反馈。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2021-12-22
    • 2020-06-14
    • 1970-01-01
    • 2021-05-02
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多