2014-03-12 24 views
0

我目前正在處理類com.sun.management.GcInfo的一些煩惱。 我通過添加GC通知監聽程序改進了我們的服務器日誌。每當主要GC發生時,我會記錄它花費的時間(以及其他一些東西)。 「官方」方式是爲GarbageCollectorMXBean bean添加通知監聽器。 一切按預期工作。我得到關於GC和每個GarbageCollector的消息,我得到一個持續時間爲 的com.sun.management.GcInfo對象。我的煩惱是,目前的文件7u51指出,延遲的價值是以毫秒爲單位。 我也在7u11下運行了我們的服務器應用程序,並且持續時間似乎高了1000倍=>微秒。 有沒有人有關於此的信息?他們在哪個Java版本中改變了這一點?Java垃圾回收GcInfo.getDuration()將單位從毫秒更改爲微秒

+0

嗨!我有同樣的問題,但這個類的開始和結束時間。我的服務器正在運行oracle jdk 7u6,並且開始和結束時間的結果都很奇怪:1530938772677.該值在API中被描述爲自JVM啓動以來的毫秒數......所以這個值沒有任何意義。這也不是一個時代,因爲這個價值將會在未來。我看不到任何信息... – omartin

回答

1

這是JVM中的bug。 GcInfo方法返回刻度而不是毫秒。

這就是錯誤的描述說:

當從ManagementFactory抓住GarbageCollectorMXBean,現在有可能(在Java 7中)投底層的bean實現成NotificationBroadcaster中並添加的NotificationListener。這樣做會導致JVM在完成後報告GC事件。在JVM中,GCNotifier :: pushNotification將「原始」GCStatInfo數據(包含開始/結束滴答)放到請求隊列中。 GCNotifier :: sendNotification從此數據構造GcInfo而不將ticks轉換爲millis。當偵聽器訪問GcInfo對象時,對getDuration()的調用返回經過的tick和經過的millis(與源代碼中的註釋相反)。

因此,您應該使用JVM版本7u51或更高版本來獲取正確的GC信息。