2008-12-22 93 views
7

我已經開始使用MBeans來暴露一些有關應用程序的信息。幾乎所有的HOWTO/Tutorials/Blog posts/Samples在線教你如何實現一個MBean並將它註冊到一個MBean服務器上,但從不提及(或者只是輕鬆地)從服務器註銷MBean。是否需要從Platform MBean Server註銷MBean?

我很關心一個MBean,它需要引用相當重量級的對象才能提供有關該對象的狀態信息。

平臺MBean服務器是否保留對MBean或其他此類技巧的弱引用,以確保它最終在GC應用中不再有任何引用時引用GC?註銷通常是不必要的,從而解釋了爲什麼沒有人在JMX教程中談論它?

回答

5

您不能「微弱地」向服務器(尚未)註冊MBean,因此當沒有其他引用存在時,就會期望它被GCed。

這就是說,你一定要閱讀Eamonn McManus關於這個主題的一些帖子。

https://web.archive.org/web/20120207140653/http://weblogs.java.net/blog/emcmanus/archive/2005/07/cleaning_up_an_1.html

它已經建議JMX API 可能對 「弱的MBean」像這樣一些明確的支持。我不確定 他們有足夠的用途來證明 包括它們在API中,而我 也不知道弱Weak MBeans的通用 API是什麼樣子。 但上面的內容顯示瞭如果需要的話,您可以創建自己的弱MBean的 。

https://web.archive.org/web/20090114131740/http://weblogs.java.net/blog/emcmanus/archive/2005/07/javaone_feedbac.html

「弱」 的MBean。一個MBean頻繁地管理另一個Java對象,該對象是要監視的「資源」的 或被控制的 。但是如果對該資源的唯一 引用來自 MBean呢?我們可以以某種方式安排 MBean消失,如果資源 不再被其他任何人蔘考 ?

打開和關閉昂貴的MBean。 某些MBeans可能會導出連續採樣的信息 ,並且 收集起來很昂貴。您不需要 必須讓這些MBean始終運行爲 。臨時解決方案 很容易,例如 setThreadContentionMonitoringEnabled 方法 java.lang.management.ThreadMXBean。但是 也許可以有一個更一般的 約定,比如 setDetailLevel(int)方法。