2012-08-09 73 views
2

我正在編寫一個應用程序,該應用程序應該運行多個小時(10-100),我使用JMX進行監視。JMX RMI - 內存泄漏 - ArrayNotificationBuffer隨着時間變得越來越大

然而,一段時間後,我發現兩件事情:

  • com.sun.jmx.remote.internal.ArrayNotificationBuffer#1變得更大:20小時後,它的大約10MB的 - 當我開始它,它是小於1個MB
  • 多個線程像RMI TCP Accept-0(或任何其他號碼)和RMI-TCP-Connection(44)-[IP]隨着時間的推移實例化。

我在想,它與應用程序的不同連接有關,但目前我只連接了一次,但一些連接似乎仍然打開。

這怎麼可能?我怎樣才能解決這個問題?

+0

我不會使用RMI + JMX來長時間監視應用程序。它會產生相當多的垃圾。我會用一個簡單的日誌文件和/或套接字來發布你所需要的信息。 – 2012-08-09 12:51:47

+0

爲什麼要重新發明輪子?我想要內存和CPU使用情況統計信息。我不明白爲什麼我應該完全自己寫下 – Stefan 2012-08-09 12:56:06

+0

除非它總是與你平平,否則你不需要重新發明輪子。 ;) – 2012-08-09 12:59:05

回答

1

我在ArrayNotificationBuffer的源代碼註釋中發現了它,它有相當數量的JMX跟蹤日誌記錄,因此您可能想要enable JMX tracing更好地瞭解正在發生的事情。

您可能會發現this known bug正在影響您。該錯誤報告表明該問題是在長期連接中觀察到的。有幾個提到的解決方法,但更簡單的解決方法不是,如果對您來說是可行的,那就是定期斷開連接並重新連接。好消息是Java7中似乎有一個patch,儘管我不確定它是否已達到發佈版本。

我也會確保,如果您正在註冊JMX通知偵聽器,那麼它們會持續並及時地處理通知。不這樣做也可能導致這種症狀。