如何在主要垃圾回收后通过 JMX 或代码监控内存

How to monitor memory after major garbage collection via JMX or code

许多监控工具,比如那些非常棒的 JavaMelody,只是监控当前的内存使用情况。如果你想检查内存泄漏或即将发生的内存不足情况,这不是特别有用,如果你有一个应用程序会生成大量垃圾并立即收集。不完美,但恕我直言,更有趣的是在主要垃圾收集后立即监视内存使用情况。如果这个值很高,那么崩溃就在你身边。

因此:您能否在上次主要垃圾回收后立即找出内存使用情况 - 从 Java 代码或通过 JMX?我知道有一些像 VisualVM 这样的工具可以做到这一点(这不是生产使用的选项),它可以写在垃圾收集日志中,但我正在寻找比解析垃圾更直接的解决方案收集日志文件。 :-) 明确一点:我正在寻找可以轻松用于生产中任何应用程序的东西,而不是任何昂贵的调试工具。

以防万一:JDK 7 with -XX:+UseConcMarkSweepGC ,但我也对一般答案感兴趣。

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

关于 gc 后可用内存的信息(youg 或 old)可通过 JMX 获得。

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

此外,从Java 7 开始,JMX 通知订阅可用于接收 GC 事件而无需轮询。

您可以找到使用 GC MBean 的代码示例 here

一种非常粗略的方法是在一段时间内监控 Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() 的最小值。至少这不需要您了解有关内存池的详细信息,如监控 does. This might require you to get notifications about garbage collections.