附录 F. 调整 JVM 在 Linux 容器中运行
当您允许 JVM ergonomics 为垃圾收集器、堆大小和运行时编译器设置默认值时,在 Linux 容器中运行的 Java 进程的行为不如预期。当您执行不带任何调优参数的 Java 应用程序时,例如: java -jar mypplication-fat.jar
wagon-busyboxthe JVM 会自动根据主机限制设置多个参数,而不是 容器限制。
本节提供有关在 Linux 容器中打包 Java 应用程序的信息,以便考虑计算默认值时容器的限制。
F.1. 调整 JVM
当前的 Java JVM 代不是容器感知型,因此它们根据物理主机的大小来分配资源,而不是容器的大小。例如,JVM 通常将主机上物理内存的 最大堆大小 设置为 1/4。在大型主机上,这个值可以轻松地超过为容器定义的内存限值,如果在运行时超过容器限制,OpenShift 将终止该应用。
要解决这个问题,您可以使用 OpenShift 基础镜像上的 Fuse,该镜像可以了解 Java JVM 在受限容器中运行的,并在未手动完成时自动调整最大堆大小。它提供了为运行应用的 JVM 设置最大内存限值和核心限制的解决方案。对于 OpenShift 镜像上的 Fuse,它可以:
- 根据容器内核设置 CICompilerCount
- 当容器内存限制低于 300MB 时,禁用 C2 JIT 编译器
- 低于 300MB 时,对默认堆大小使用一倍的容器内存限值