【问题标题】:Why does heap memory usage graph look like this?为什么堆内存使用图是这样的?
【发布时间】:2018-05-25 19:11:56
【问题描述】:

我已在我的 JVM 中安装了 gloomroot(Java 应用程序监控)。当我的应用程序空闲时,我会得到这种内存堆使用情况的图形。图案看起来几乎是均匀的。有人可以解释一下并指出我为什么该图表看起来像这样的任何博客文章吗?我好奇。

【问题讨论】:

  • 这通常发生在JVM进入完全垃圾回收(full GC)的时候。 Java 运行时总是试图释放不再使用的内存,但有时它无法比正在使用的内存更快地清除内存。在某个时刻,JVM 内存不足,需要清除一些空间。进入full GC。这是一个停止世界进程,它试图释放所有未引用的数据。如果您不小心,可能会导致一些异常错误,并且您拥有的对象越多,完整 GC 的时间就越长。
  • 这个问题应该对你也有帮助why a sawtooth shaped graph?

标签: java apm


【解决方案1】:

大规模锯齿模式表示 GC 周期之间的内存利用率。应用程序稳定地分配对象(向上倾斜的线),直到堆足够满,VM 可以决定运行 GC(点)。然后 GC 回收大量垃圾(急剧下降)并重新开始该过程。

上下的短尖峰更难理解。向上的尖峰可能代表触发年轻代周期的异常“大”分配(短生命周期对象)。向下的尖峰可能表示响应“内存压力”而释放缓存对象。

如果您想更好地了解峰值,您需要查看 GC 日志消息,并尝试将它们与图表相关联。

【讨论】:

    【解决方案2】:

    看起来是这样的,因为(至少)你正在观察它。如果您的应用程序完全没有执行任何操作,并且没有线程进行任何分配,那么您将得到一条水平线作为堆。

    但是,既然您正在观察它,那么 JVM 中正在做一些事情来将这些数据返回给您。这就是为什么您会在许多分析问题中看到无处不在的锯齿图案。下面举几个例子。

    java memory leak, visualvm showing wrong data

    visualvm monitors memory usage

    【讨论】:

    • “因为你正在观察它”是一个有趣的见解。不是 100% 确定这是真的,但这似乎是一个重要的考虑因素!
    【解决方案3】:

    这就是 java 垃圾收集的工作。每个 drop 都是垃圾收集器通过删除未使用的引用来释放内存。它再次增长的原因仅仅是因为您的应用程序不断创建新的引用。

    您还可以查看这篇文章以获得更深入的解释: Why a sawtooth shaped graph?

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 2020-10-26
      • 2020-02-11
      • 1970-01-01
      • 2015-08-04
      • 2016-08-03
      • 2017-02-27
      相关资源
      最近更新 更多