堆转储和不必要的堆使用的 JVM GC 行为

问题描述

我们在调整 JVM 的内存管理时遇到问题。在 k8s 集群上运行相同的应用程序,但是其中一个 pod 的 jvm 堆使用率上升到了约 95%,并且当我们尝试在这个 vs 上获取堆转储时,不知何故 gc 运行并且堆使用率突然下降,给我们留下了微小的堆转储。

我认为旧空间不必要地增长了,并且gc没有工作来回收内存(近15个小时)。不幸的是,我们看不到什么占用了空间,因为在强制执行 gc 时,堆转储非常小。

所有 3 个 pod 的内存均为 1500m 并且 这是 jvm 堆使用百分比图(3 个 pod,绿色是有问题的一个):

JVM Heap Usage

详情:

openjdk 15.0.1 2020-10-20
OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15.0.1+9,mixed mode,sharing)

JVM 参数:

-XX:MaxRAMPercentage=75
-XX:InitialRAMPercentage=75
-server
-Xshare:off
-XX:MaxMetaspaceSize=256m
-Dsun.net.inetaddr.ttl=60
-XX:-OmitStackTraceInFastThrow
-XX:+ShowCodeDetailsInExceptionMessages

问题是:

  • 为什么在我们尝试获取堆转储时会调用完整的 gc?
  • gc 不回收内存并导致应用程序运行时堆大小在约 70% 到约 95% 之间的动机是什么,而 jvm 可以使用并且仅在 10% 时完美运行?
  • 如何强制 jvm 更积极地执行 gc 以避免这种情况?还是应该在生产环境中完成?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)