繁体   English   中英

JVM内存使用模式问题

[英]JVM Memory usage patter issue

我最近使用应用程序监控工具 (StatsD) 配置了一个 JBOSS 应用程序,它有助于捕获应用程序的 JVM 利用率。 即使没有任何单个用户使用该应用程序,内存模式也会触及已分配内存 (1024 MB) 的 90-95% (850 - 970 MB)。 Minor GC 在内存达到 90-95% 的每个点运行。 请参阅下面的屏幕截图。

请求您的帮助以了解这种内存模式的原因。 *没有批处理作业或后台进程正在运行。

在此处输入图片说明

这对我来说只是正常行为。 使用的堆空间逐渐增加到 GC 运行的点。 然后 GC 回收大量空闲空间,使用的堆空间急剧下降。 然后重复。

看起来您在同一图中有来自两个独立 JVM 的统计数据,但我想您知道这一点。 (您已经掩盖了可以解释这一点的图表上的标签。)

我能从中收集到的唯一另一件事是内存分配率偏高导致 GC 频繁运行。 可能建议进行一些 GC 调整。 但我只会建议,如果应用程序级性能受到影响。 (而且很可能真正的问题是应用程序效率而不是 GC 性能。)

然后:

但是我在这里也遇到了一个问题,堆转储说它是 ~1GB,但是当我将它上传到 Eclipse MAT 时,它只显示了 11MB 的转储。 大多数重物都可以在 MAT 的“未到达的物体”部分下看到。 如果您有任何想法或使用 MAT 进行分析,请告诉我为什么 1GB 转储在 MAT 中仅显示 11MB 大小。

这也很容易解释。 “未到达的对象”是垃圾。 当堆使用量接近峰值之一时,您必须立即运行堆转储工具。


退后一步,我不清楚您在这里真正要寻找的是什么:

  • 如果您只是想了解监控是什么样的,这就是 JVM 通常的样子。

  • 如果您正在尝试调查性能问题(GC 暂停等),您需要查看其他证据。

  • 如果您正在寻找内存泄漏的证据,那么您找错了地方。 这些图表对此无济于事。 您需要长期关注 JVM 的行为。 在“锯齿”中寻找诸如长期趋势之类的东西,例如趋势向上的低谷底部的水平。 并且要调查可疑的内存泄漏,您需要比较一段时间内对转储的 MAT 分析。

    但请记住,随着时间的推移增加内存使用量不一定是内存泄漏。 它可能是一个库缓存东西的应用程序。 如果 JVM 开始耗尽内存,正确实现的缓存将释放对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM