Kubernetes Pod 上 Java 17 应用程序的非堆中的最大内存过多

Excessive Max Memory in Non-Heap for Java 17 App on Kubernetes Pod

提问人:Eugen Gerb 提问时间:11/16/2023 最后编辑:Eugen Gerb 更新时间:11/16/2023 访问量:48

问:

我有一个在容器中运行 Java 17 应用程序的 Kubernetes Pod。Pod 配置了 2GB 请求和有限的内存。

对于 Java 17 应用程序,我设置了标志 -XX:MaxRAMPercentage=50,并且默认启用 -XX:+UseContainerSupport 标志。

我使用 Prometheus 收集了 JVM 内存指标(已用、最大和已提交),我注意到非堆内存似乎具有异常高的最大值。

下面是所选 Pod 的 JVM Memory Grafana 图表的屏幕截图:

JVM 内存 Grafana 图表

最大内存

MaxHeapSize

我知道除了 Java 堆之外,非堆(例如,元空间)也发挥了作用,并且似乎是罪魁祸首。但是,我很困惑为什么非堆最大内存如此之高。

我的具体问题是:

  • 普罗米修斯如何计算jvm_memory_max_bytes?

  • 如何确定非堆的额外最大 JVM 内存来自何处?

感谢您的任何见解或指导!

我尝试对 -XX:MaxRAMPercentage 标志使用不同的值。

我无法使用 jmap 或 jcmd 等工具,因为图像是 JRE。

JProfiler 适合帮助我解决这个问题吗?

Java Kubernetes 内存管理 JVM

评论


答: 暂无答案