2008-12-22 94 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)方法。