如何通过JMX或代码在主要垃圾收集之后监视内存



许多监视工具,如JavaMelody,只是监视当前的内存使用情况。如果您希望检查内存泄漏或即将出现的内存不足情况,如果您的应用程序生成了大量需要立即收集的垃圾,那么这不是特别有用。虽然不完美,但我认为更有趣的是,在主要垃圾收集之后立即监视内存使用情况。如果这是高的,坠机正在逼近你。

那么:你能在最后一次主要垃圾收集之后立即发现内存使用情况吗?无论是从Java代码还是通过JMX?我知道有一些像VisualVM这样的工具可以做到这一点(这不是生产使用的选项),它可以写在垃圾收集日志中,但我正在寻找比解析垃圾收集日志文件更直接的解决方案。需要说明的是:我正在寻找一种可以在生产环境中轻松使用的工具,而不是任何昂贵的调试工具。

如果这很重要:JDK 7使用-XX:+UseConcMarkSweepGC,但我也对一般答案感兴趣。

在gc之后可用的内存信息(年轻的或旧的)可以通过JMX获得。

垃圾收集器MBean有属性LastGcInfo,它是一个复合数据对象,包括GC前后内存池大小的信息。

此外,从Java 7开始,可以使用JMX通知订阅来接收GC事件,而不需要轮询。

您可以在这里找到使用GC MBean的代码示例。

可能'Dynatrace'是一个选项…它是一个非常强大的监控工具(不仅针对内存)。http://www.dynatrace.com/en/index.html

一种非常粗糙的方法是在一段时间内监测Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()的最小值。至少这不会要求您了解内存池的详细信息,就像在Alexey Ragozin的回答中监控LastGcInfo那样。这可能需要您获得关于垃圾收集的通知。

相关内容

最新更新