JVM的GC事件的程序化通知

7

我希望能够追踪在GC上花费了多少时间以及收集了多少内存,但不想通过分析GC日志(即分析从-XX:+PrintGCWhatever得到的内容)来实现。

我发现可以使用Sun的ManagementFactory来获取一个GarbageCollectorMXBean,该Bean可以给出一些包含内存信息的GCInfo对象,但我无法保证可以通过这种方式收集所有 GC。

有人知道如何在代码中实现这个功能吗?

2个回答

4

GarbageCollectorMXBean 是我在Sun JVM中能找到的最好的。根据我的经验,它实际上非常接近你所要求的。

我想你可以有一个专门的线程,定期唤醒以获取GC统计信息。这将增加收集统计信息的确定性。


这是我自己发现的。但我不确定GCMXbean的行为。getGCInfo()的文档说它“返回最近的GCInfo”,但没有说它返回所有 GCInfo。这可能是情况,但在尝试自己弄清楚之前,我很想知道是否有人知道答案。 - insitu
1
顺便说一句,我发现这个链接http://robertmaldon.blogspot.com/2007/09/more-human-friendly-java-gc-timestamps.html非常接近我想要的,但并不完全符合。 - insitu

0

鉴于获取此信息的工具范围,最好使用它们来分析您的GC行为并进行优化。例如,使用内存分析器。

您面临的问题是,除非该信息指向问题的解决方案(然后您可以修复它),否则该信息并不是非常有用。


3
我不同意。当然,我会在我的服务器应用程序中收集GC统计数据(因为它们往往对延迟非常敏感,所以GC是一个大问题)。这会提醒我存在问题,例如当使用模式发生变化时。当然,解决问题需要使用不同的工具。 - NPE
我想要实现的是在Java中使用某种方法来减少设置/解析/分析的复杂性。jstat和其他工具非常好用,而且存在许多第三方工具(其中大部分我并不知道)也很好用,但是使用它们意味着启动一个进程,然后分析一些输出。考虑到所有信息都来自于我正在运行的JVM,人们可能会认为有一种方法可以从JVM内部访问这些信息。 - insitu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接