JVM 堆使用变化。这个图正常吗?

JVM heap usage variation. Is this graph normal?

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

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

  2. 在两个垃圾收集器周期内,平均堆使用率逐渐下降并突然飙升。这是什么原因?

  3. 第二条评论说的逐渐下降里面,没有平稳下降,有震荡。这是什么原因?

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

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

  2. 您很可能 运行 并发 GC,只要有可用内存,它就不会执行完整的 GC 周期。锯齿纹的牙齿大概是从幸存者space移动到老space.

  3. 的活物
  4. 同1.

与其看图片,不如了解一些基本参数并判断它们是否适合您的应用:

  1. 新space GC

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

  4. 的持续时间和频率是多少
  5. GC花费了多少时间

  6. 在 GC 中花费了多少 CPU%

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