OpenJDK 1.8.0_242,MaxRAMFraction 设置未反映

OpenJDK 1.8.0_242, MaxRAMFraction setting not reflecting

我是 运行 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

Max heap is being capped at 256MB.

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

I tried updating the MaxRAMFraction setting to 1

MaxRAMFraction 已弃用且未使用,忘掉它吧。

UseCGroupMemoryLimitForHeap

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

MaxRAM=2g

你知道这实际上是做什么的吗?它设置 JVM 认为您拥有的 "physical" RAM 的值。

我想你不是故意在这里设置 -Xms-Xmx 吧?由于您不知道容器将有多少内存?如果是这样,我们就处在同样的境地。我们知道我们要得到的最小值是1g,但我不知道最大值,因此我不想设置-Xms-Xmx 明确。

相反,我们这样做:

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

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

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