首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测低堆情况以进行监视和报警?

如何检测低堆情况以进行监视和报警?
EN

Stack Overflow用户
提问于 2015-08-03 17:40:37
回答 1查看 1.4K关注 0票数 2

我们监视我们的生产JVM,并有监视触发器(理想情况下),当JVM在堆空间上运行不足时,它们会发送警告。然而,想出一个有效的检测算法是相当困难的,因为在GC启动之前,应用程序通常没有可用内存,这是垃圾收集的本质。

有很多方法可以解决这个问题,我能想到。例如监视可用的空间,当它变得太低时发送警告,但是延迟它,只有当它持续超过一分钟时才触发。那么,什么在实践中对你有用?

特别有趣的是:

  • 如何检测需要立即响应的关键内存/堆问题?
  • 如何检测堆问题,需要采取预防措施?
  • 什么方法普遍有效?例如,不需要将触发器调整到特定的JVM调优参数,反之亦然,或者,强制GC在特定的时间间隔内进行。
  • 是否有广泛使用的最佳做法?
EN

回答 1

Stack Overflow用户

发布于 2015-08-03 19:46:18

我发现JVM内存健康的一个非常有效的度量是JVM在垃圾收集上花费的时间百分比。一个健康的、经过良好调整的JVM将很少使用(< 1%左右)的CPU时间来收集垃圾。一个不健康的JVM将“浪费”大量的时间来保持堆的干净,在经历内存泄漏或最大堆设置过低的JVM中,用于收集的CPU百分比将成倍上升(当使用更多的CPU保持堆干净时,使用较少的“实际工作”...assuming,入站请求率不会减慢,很容易从悬崖上掉下来,因为在实际得到java.lang.OutOfMemoryError之前,无法很快完成足够多的工作)。

值得注意的是,这也是你想要防范的情况。实际上,您并不关心JVM是否使用它的所有堆,只要它能够有效地回收内存而不妨碍它需要做的“真正的工作”。(实际上,如果您从未达到最大堆大小,则可能需要考虑缩小堆。)

这个统计数据是由许多现代JVM提供的(至少Oracle和IBM是这样的)。

另一种比较有效的措施可以是完全GCs之间的间隔时间。执行完整GC的次数越多,您在GC中花费的时间就越多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31793461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档