【问题标题】:JVM heap usage variation. Is this graph normal?JVM 堆使用变化。这个图正常吗?
【发布时间】:2020-07-19 14:29:10
【问题描述】:

这是运行负载测试 (Xmx=10g) 时预生产服务器的 JVM 内存使用情况。我有几个问题。

  1. 垃圾收集器几乎每 5 分钟运行一次。在这 5 分钟内,堆从 3GB 增长到 10GB。这种增长正常吗?如果没有,如何分析我的应用程序中的问题?

  2. 在两个垃圾收集器周期内,平均堆使用量逐渐减少并突然达到峰值。这是什么原因?

  3. 在第二条评论中提到的逐渐下降的内部,没有平滑的下降,有一个振动。这是什么原因?

【问题讨论】:

  • 对我来说这看起来像是正常/合理的 GC 行为。您只需担心每 5 分钟的峰值是否呈上升趋势。
  • 只要没有达到配置的最大堆或完全 GC 阈值,即使上升趋势也不会令人担忧。
  • 好点。如果您的应用程序具有(正确实现的)缓存,它可以安全地使用内存达到限制。问题是你的数据结构是否会无限增长;例如内存泄漏。

标签: java jvm load-testing


【解决方案1】:

这种堆利用模式有时被称为“锯”,看起来很健康,因为在您的情况下它保持一致。查看Memory Leaks: Fallacies and Misconceptions 文章,该文章深入探讨了常见的堆利用模式及其问题。

  1. 答案取决于应用程序代码,对于某些应用程序是正常的,而对于其他应用程序则不是。弄清楚它的唯一方法是了解应用程序在做什么。

  2. 您很可能正在运行并发 GC,只要有可用内存,它就不会执行完整的 GC 周期。锯齿图案的齿很可能是从幸存者空间移动到旧空间的活体。

  3. 同1。

您想了解一些基本参数并判断它们是否适合您的应用程序,而不是看图片:

  1. 新空间GC的持续时间和频率是多少

  2. old space GC的持续时间和频率是多少

  3. GC 花费了多少时间

  4. 在 GC 中花费了多少 CPU 百分比

  5. GC 对应用程序延迟的影响

【讨论】:

  • 嗨,卡罗尔,非常感谢您的解释。您指出的文件内容丰富且有用。
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多