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
(%).
我是 运行 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
(%).