我目前正在处理com.sun.management.GcInfo类的问题。
我通过添加GC通知侦听器改进了服务器日志。每当发生重大GC时,我都会记录其花费的时间(以及其他一些信息)。
“官方”方式是为GarbageCollectorMXBean bean添加一个通知侦听器。
一切正常。我得到了有关GC的通知,对于每个GarbageCollector,我都会得到一个
com.sun.management.GcInfo具有持续时间的对象。令我烦恼的是,当前文档7u51指出持续时间的值以毫秒为单位。
我也在7u11下运行了服务器应用程序,持续时间似乎增加了1000 =>微秒。
有人知道吗?他们在哪个Java版本中进行了更改?
最佳答案
这是JVM中的bug。 GcInfo方法返回刻度而不是毫秒。
这就是错误描述所说的:
当从ManagementFactory获取GarbageCollectorMXBean时,现在(在Java 7中)现在可以将基础Bean实现转换为NotificationBroadcaster并添加NotificationListener。这样做会使JVM在完成GC事件后报告它们。在JVM中,GCNotifier :: pushNotification将“原始” GCStatInfo数据(包含开始/结束刻度)放入请求队列。 GCNotifier :: sendNotification可以从此数据构造GcInfo,而无需将刻度转换为毫。当侦听器可以访问GcInfo对象时,对getDuration()的调用将返回经过的滴答声与经过的毫秒数(与源代码中的注释相反)。
因此,您应该使用JVM 7u51或更高版本来获取正确的GC信息。