Java垃圾收集GcInfo.getDuration()将单位从毫秒更改为微秒

时间:2014-03-12 07:05:58

标签: java logging garbage-collection garbage

我目前正在处理类com.sun.management.GcInfo的一些烦恼。 我通过添加GC Notification Listener改进了我们的服务器日志。每当主要GC发生时,我都会记录它所用的持续时间(以及其他一些东西)。 “官方”方式是为GarbageCollectorMXBean bean添加通知监听器。 一切都按预期工作。我得到了关于GC的信息,并且我得到了每个GarbageCollector com.sun.management.GcInfo具有持续时间的对象。令我烦恼的是,目前的文件7u51规定,持续时间的价值是毫秒。 我也在7u11下运行我们的服务器应用程序,并且持续时间似乎更高,因为1000 =>微秒。 有没有人有这方面的信息?他们在哪个Java版本中改变了它?

1 个答案:

答案 0 :(得分:1)

这是JVM中的bug。 GcInfo方法返回 ticks 而不是毫秒。

这就是错误说明:

  

从ManagementFactory获取GarbageCollectorMXBean时,现在可以(在Java 7中)将底层bean实现转换为NotificationBroadcaster并添加NotificationListener。执行此操作会导致JVM在GC事件完成后报告。在JVM中,GCNotifier :: pushNotification将“原始”GCStatInfo数据(包含开始/结束标记)放入请求队列。 GCNotifier :: sendNotification从此数据构造GcInfo,而不将ticks转换为millis。当侦听器访问GcInfo对象时,对getDuration()的调用将返回经过的刻度与经过的millis(与源代码中的注释相反)。

因此,您应该使用JVM版本7u51或更高版本来获取正确的GC信息。