附录 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 时,对默认堆大小使用一倍的容器内存限值
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.