Kubernetes 和 JVM 内存设置

PNS*_*PNS 2 java jvm memory-management heap-memory kubernetes

Kubernetes具有众多微服务的集群中,其中一个专门用于Java Virtual Machine运行Java 1.8数据处理应用程序的(JVM)。

直到最近,在该 JVM pod 中运行的作业消耗的 RAM 还不到 1 GB,因此 pod 的最大内存设置为 4 GB,没有为 JVM 设置任何明确的堆大小。

一些新数据现在整个 pod 需要大约 2.5 GB 的空间,包括 JVM(如kubernetes top命令所报告的,在启动后内存限制增加到 8 GB),但是 pod 在以 4 GB 的限制启动后很快崩溃。

使用-Xms256m -Xmx3072m限制为 4 GB的磁头大小范围并不能解决问题。事实上,现在 pod 甚至还没有启动。

有没有办法参数化 JVM 以适应所需的 2.5 GB,而不增加 pod 的 4 GB 最大内存?

Jur*_*nka 6

如果未指定,默认的“最大堆”-Xmx是主机 RAM 的 1/4 (25%)。JDK 10 改进了对容器的支持,因为它使用容器的 RAM 限制而不是底层主机。正如@David Maze 所指出的,这已被移植到 JDK 8。

假设您有足够新的 JDK 8 版本,您可以使用-XX:MaxRAMPercentage修改用于最大堆的总 RAM 的默认百分比。所以,而不是指定-Xmx你可以告诉,例如-XX:MaxRAMPercentage=75.0。另见https://medium.com/adorsys/usecontainersupport-to-the-rescue-e77d6cfea712

下面是一个使用 alpine JDK docker 镜像的例子: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"
Run Code Online (Sandbox Code Playgroud)