7

我已经开始使用 MBeans 来公开有关应用程序的一些信息。几乎所有的 HOWTO / 教程 / 博客文章 / 在线示例都教您如何实现 MBean 并将其注册到 MBean 服务器,但从未提及(或只是粗略地)从服务器取消注册 MBean。

我担心一个 MBean 需要引用一个相当重量级的对象才能提供有关该对象的状态信息。

平台 MBean 服务器是否维护对 MBean 的弱引用或其他类似的技巧,以确保如果您的应用程序不再持有对它的任何引用,它最终会被 GC 处理?注销通常是不必要的,从而解释了为什么没有人在 JMX 教程中谈论它?

4

1 回答 1

5

您不能“弱”地向服务器注册 MBean(还),从而期望在没有其他对它的引用时对它进行 GC。

话虽这么说,您绝对应该阅读 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 中是合理的,而且我也不确定弱 MBean 的通用 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。一些 MBean 可能会导出连续采样且收集起来成本很高的信息。您不一定希望这些 MBean 一直在运行。临时解决方案很简单,例如 java.lang.management.ThreadMXBean 中的 setThreadContentionMonitoringEnabled 方法。但也许会有更通用的约定,例如 setDetailLevel(int) 方法。

于 2008-12-26T21:36:31.527 回答