java - jvm运行垃圾收集时Kubernetes Pod内存使用率不下降

标签 java kubernetes jvm

我很难理解为什么我的 Java 应用程序会慢慢消耗 Pod 可用的所有内存,导致 Kubernetes 将 Pod 标记为内存不足。 JVM (OpenJDK 8) 使用以下参数启动:

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2

我正在监视 Pod 使用的内存以及 JVM 内存,并希望看到一些相关性,例如在主要垃圾收集之后,使用的 Pod 内存也会下降。但是我没有看到这一点。我在下面附上了一些图表:

Pod 内存: enter image description here JVM 总内存 enter image description here JVM 的详分割解(抱歉所有颜色看起来都一样......感谢 Kibana) enter image description here

我正在努力解决的是,为什么当 16:00 之前堆内存显着减少时,Pod 内存不会也下降?

最佳答案

看起来您正在创建一个资源限制为 1GB 内存的 Pod。 您正在设置-XX:MaxRAMFraction=2这意味着您将 50% 的可用内存分配给 JVM,这似乎与您绘制的 Memory Limit 相匹配。 .

JVM 然后保留您在 Memory Consumed 中绘制的内容的大约 80% .

当您查看Memory Consumed时您不会看到内部垃圾回收(如第二张图中所示),因为 GC 内存已释放回 JVM,但仍由 JVM 保留。

您的java应用程序是否可能存在内存泄漏?随着时间的推移,它可能会导致保留更多内存,直到达到 JVM 限制(512MB)并且您的 pod 被 OOM 杀死。

关于java - jvm运行垃圾收集时Kubernetes Pod内存使用率不下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279068/

相关文章:

kubernetes - 从 Prometheus helm chart 向 slack 发送警报

docker - 各种 Minikube + Kubernetes IP 地址有什么区别?

java - Kubernetes java api 客户端更改 pod 标签

servlets - 在单个 JVM 实例中部署 Clojure 应用程序

java - 如何在android中获取可绘制图像的大小

java - 在 DynamicReport 中声明动态列

java - Spring Batch配置异常

java - oracle adf Valuechangelistener 空指针异常

包含私有(private)调用的 Java 内联方法

Tomcat 使用项目目录作为相对路径