我已经开始使用MBean来公开有关应用程序的一些信息.相当多的HOWTO文档/教程/博客文章的整体性/样品在线教你如何实现一个MBean与MBean服务器注册它,但从来不提(或仅粗略)从服务器注销的MBean.
我担心MBean需要引用一个相当重量级的对象才能提供有关该对象的状态信息.
Platform MBean Server是否维护对MBean的弱引用,或其他一些此类技巧,以确保如果您的应用程序不再持有任何引用,它最终会获得GC?注销通常是不必要的,从而解释为什么没有人在JMX教程中讨论它?
您不能"弱"地向服务器(尚未)注册MBean,从而期望在没有其他对它的引用时将其作为GCed.
话虽这么说,你肯定应该阅读Eamonn McManus关于这个主题的一些帖子.
有人建议JMX API可以像这样明确支持"弱MBean".我不确定他们是否足以证明将它们包含在API中是合理的,而且我也不确定Weak MBeans的通用API会是什么样子.但是上面展示了如果需要你如何创建自己的弱MBean.
"弱"的MBeans.MBean经常管理另一个Java对象,该对象是要监视或控制的"资源".但是,如果对该资源的唯一引用来自MBean呢?如果资源不再被其他人引用,我们能以某种方式安排MBean消失吗?
打开和关闭昂贵的MBean.某些MBean可能会导出连续采样的信息,并且收集起来很昂贵.您不一定希望这些MBean始终在运行.临时解决方案很简单,例如java.lang.management.ThreadMXBean中的setThreadContentionMonitoringEnabled方法.但也许可能有更通用的约定,例如setDetailLevel(int)方法.