问题描述
我们在调整 JVM 的内存管理时遇到问题。在 k8s 集群上运行相同的应用程序,但是其中一个 pod 的 jvm 堆使用率上升到了约 95%,并且当我们尝试在这个 vs 上获取堆转储时,不知何故 gc 运行并且堆使用率突然下降,给我们留下了微小的堆转储。
我认为旧空间不必要地增长了,并且gc没有工作来回收内存(近15个小时)。不幸的是,我们看不到什么占用了空间,因为在强制执行 gc 时,堆转储非常小。
所有 3 个 pod 的内存均为 1500m 并且 这是 jvm 堆使用百分比图(3 个 pod,绿色是有问题的一个):
详情:
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 (将#修改为@)