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

Java 如何通过JMX或代码在主要垃圾收集之后监视内存,java,memory-leaks,garbage-collection,monitoring,Java,Memory Leaks,Garbage Collection,Monitoring,许多监控工具,比如phantastic,只监控当前的内存使用情况。如果您想检查内存泄漏或即将出现的内存不足情况,如果您有一个生成垃圾并立即收集的应用程序,那么这并没有特别的帮助。这并不完美,但我觉得更有趣的是,在一次大的垃圾收集之后立即监控内存使用情况。如果这个数字很高,一场碰撞就在你的头顶上 那么:在最后一次主要垃圾收集之后,您能立即从Java代码或通过JMX找到内存使用情况吗?我知道有一些工具可以这样做(这对于生产使用是没有选择的),并且可以将其写入垃圾收集日志,但我正在寻找一种比解析垃圾收

许多监控工具,比如phantastic,只监控当前的内存使用情况。如果您想检查内存泄漏或即将出现的内存不足情况,如果您有一个生成垃圾并立即收集的应用程序,那么这并没有特别的帮助。这并不完美,但我觉得更有趣的是,在一次大的垃圾收集之后立即监控内存使用情况。如果这个数字很高,一场碰撞就在你的头顶上

那么:在最后一次主要垃圾收集之后,您能立即从Java代码或通过JMX找到内存使用情况吗?我知道有一些工具可以这样做(这对于生产使用是没有选择的),并且可以将其写入垃圾收集日志,但我正在寻找一种比解析垃圾收集日志文件更简单的解决方案。:-)需要明确的是:我正在寻找可以在生产中的任何应用程序中轻松使用的东西,而不是任何昂贵的调试工具


如果这很重要:jdk7和-XX:+useConMarkSweepGC,但我也对一般答案感兴趣。

可能“Dynatrace”是一个选项。。。它是一个非常强大的监控工具(不仅仅是内存)。

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

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

此外,从Java7JMX开始,可以使用订阅通知来接收GC事件,而无需轮询


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

一种非常粗糙的方法是在一段时间内监视
运行时.getRuntime().totalMemory()-Runtime.getRuntime().freemory()的最小值。至少,这不需要您像监视一样了解内存池的详细信息。这可能需要您这样做。

谢谢,但我说的是生产中的正常使用,在生产中,钱是个问题。(我更新了问题以更好地反映这一点)。使用dynatrace可能不是一个明智的选择,编写一些代码来解析垃圾收集日志文件会容易得多。:-)