我已经开始使用MBean来展示有关应用的一些信息。几乎全部的HOWTOs / Tutorials / Blog帖子/样本在线教你如何实现MBean并将其注册到MBean Server,但从未提及(或只是轻微地)从服务器注销MBean。
我担心MBean需要引用一个相当重量级的对象才能提供有关该对象的状态信息。
Platform MBean Server是否维护对MBean的弱引用,或其他一些此类技巧,以确保如果您的应用程序不再持有任何引用,它最终会获得GC?取消注册通常是不必要的,从而解释为什么没有人在JMX教程中讨论它?
答案 0 :(得分:5)
你不能“弱”地用服务器(还)注册一个MBean,因此当没有其他引用存在时,期望它被GCed。
话虽如此,你绝对应该阅读Eamonn McManus关于这个主题的一些帖子。
有人建议使用JMX API 可以有一些明确的支持 像这样的“弱MBean”。我不确定 他们有充分的理由来证明这一点 将它们包含在API中,我就是 也不确定什么是通用的 弱MBean的API看起来像。 但上面显示了如何创建 如果需要,你自己的弱MBean。
“弱”MBeans。一个MBean经常 管理另一个Java对象 要监控的“资源”或 受控。但如果唯一的话呢 对该资源的引用来自 MBean的?我们可以以某种方式安排 如果资源,MBean将消失 不再被任何人引用 别的?
打开和关闭昂贵的MBean。 一些MBean可能会导出信息 这是连续采样的 聚会很贵。你没有 必然要那些MBean 一直在运行。临时解决方案 很容易,例如 setThreadContentionMonitoringEnabled 方法 java.lang.management.ThreadMXBean。但 或许可能会有一个更普遍的 惯例,如a setDetailLevel(int)方法。