【问题标题】:Java Garbage Collection GcInfo.getDuration() changed unit from milli to microsecondsJava 垃圾收集 GcInfo.getDuration() 将单位从毫秒更改为微秒
【发布时间】:2014-03-12 07:05:57
【问题描述】:

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

【问题讨论】:

  • 嗨!我也有同样的问题,但是这堂课的开始和结束时间。我的服务器使用 oracle jdk 7u6 运行,开始和结束时间的结果很奇怪:1530938772677。这个值在 API 中被描述为自 JVM 启动以来的毫秒数......所以这个值没有意义。这也不是一个时代,因为价值将在未来。我看不到这方面的任何信息...

标签: java logging garbage-collection garbage


【解决方案1】:

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

这就是错误描述所说的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多