附录 F. 调整 JVM 以在 Linux 容器中运行
在 Linux 容器中运行的 Java 进程不会象预期一样工作,如果您允许 JVM 诊断设置垃圾回收器、堆大小和运行时编译器的默认值,则不会如预期。当您在没有调整参数的情况下执行 Java 应用程序时,java -jar mypplication-fat.jar
sHistoryLimit-mvnthe JVM 会自动根据主机限制设置多个参数,而不是 容器限制。
本节提供有关在 Linux 容器中打包 Java 应用程序的信息,以便考虑计算默认值时容器的限制。
F.1. 调优 JVM 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
当前 Java JVM 的生成不是容器感知型,因此它们根据物理主机的大小(而非容器的大小)分配资源。例如,JVM 通常将 最大堆大小设置为 主机上的物理内存的 1/4。在大型主机上,此值可轻松超过为容器定义的内存限值,如果在运行时超过容器限制,OpenShift 将终止应用。
要解决这个问题,您可以使用 OpenShift 基础镜像上的 Fuse,它能够了解 Java JVM 在受限容器内运行,并在不手动完成时自动调整最大堆大小。它为运行应用的 JVM 提供了最大内存限值和核心限制的解决方案。对于 OpenShift 镜像上的 Fuse,它可以:
- 根据容器内核设置 CICompilerCount
- 当容器内存限制低于 300MB 时,禁用 C2 JIT 编译器
- 在 300MB 以下时,将容器内存限值的一度用于默认堆大小