In a Kubernetes
具有众多微服务的集群,其中一个专门用于Java Virtual Machine
(JVM)运行Java 1.8
数据处理应用程序。
直到最近,该 JVM Pod 中运行的作业消耗的 RAM 还不到 1 GB,因此该 Pod 已设置为 4 GB 最大内存,而没有为 JVM 进行任何显式堆大小设置。
一些新数据现在需要整个 Pod 大约 2.5 GB,包括 JVM(根据kubernetes top
命令(在以 8 GB 的内存限制启动后),但在以 4 GB 的限制启动后不久 pod 就崩溃了。
使用头部尺寸范围,例如-Xms256m -Xmx3072m
4 GB 的限制并不能解决问题。事实上,现在 Pod 甚至还没有启动。
有没有什么方法可以参数化 JVM 以适应所需的 2.5 GB,而不增加 pod 的 4 GB 最大内存?
如果未指定,则使用默认的“最大堆”-Xmx
是主机 RAM 的 1/4 (25%)。
JDK 10 改进了对容器的支持,因为它使用容器的 RAM 限制而不是底层主机。正如 @David Maze 所指出的,这已被向后移植到 JDK 8。
假设您有足够新的 JDK 8 版本,您可以使用-XX:MaxRAMPercentage
修改用于最大堆的总 RAM 的默认百分比。所以而不是指定-Xmx
你可以看出,例如-XX:MaxRAMPercentage=75.0
。也可以看看https://blog.arkey.fr/2020/10/27/maxrampercentage-is-not-what-i-wished-for/ https://blog.arkey.fr/2020/10/27/maxrampercentage-is-not-what-i-wished-for/
这是使用 alpine JDK docker 镜像的示例:https://hub.docker.com/_/openjdk https://hub.docker.com/_/openjdk(特别请参阅“让 JVM 尊重 CPU 和 RAM 限制”一节)。
# this is running on the host with 2 GB RAM
docker run --mount type=bind,source="$(pwd)",target=/pwd -it openjdk:8
# running with MaxRAMPercentage=50 => half of the available RAM is used as "max heap"
root@c9b0b4d9e85b:/# java -XX:+PrintFlagsFinal -XX:MaxRAMPercentage=50.0 -version | grep -i maxheap
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 1044381696 {product}
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
# running without MaxRAMPercentage => default 25% of RAM is used
root@c9b0b4d9e85b:/# java -XX:+PrintFlagsFinal -version | grep -i maxheap
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 522190848 {product}
openjdk version "1.8.0_265"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)