2

JMX MBeansspring 4框架中使用。我处理来自 JMX mBean 的通知并将它们作为事件处理。

为了测试替代方法,我只是注释掉了通知处理部分。这意味着我的 JMX Mbean 继续发布通知,而我只是忽略它们。

PS:我通过logstash. 为了测试我已经注释掉了Logstash配置

通知会发生什么?它将存储在哪里?它会影响应用程序中的内存/堆积吗?

4

2 回答 2

2

JMX 通知是观察者模式的一种实现。使用这种模式,不存储事件,因此不存在内存问题。

NotificationBroadcasterJava文档:

当 MBean 发出通知时,它会考虑已使用 addNotificationListener 添加但随后未使用 removeNotificationListener 删除的每个侦听器。如果为该侦听器提供了一个过滤器,并且该过滤器的 isNotificationEnabled 方法返回 false,则该侦听器将被忽略。否则,将使用通知调用侦听器的 handleNotification 方法...

也可以看看

失效的侦听器问题

观察者模式链接指的是这个问题。需要明确的是,这个潜在的内存链接与您最初担心的(存储通知)不同。此内存泄漏是由未取消注册的侦听器引起的,例如 logstash 侦听器。如果一个监听器没有被注销,那么它可能不会被垃圾回收。

如果您对此感到担忧,则需要确认注释掉 logstash 配置会阻止侦听器首先注册(它可能确实如此)。无论如何,这对您来说可能不是问题,因为它只是一个侦听器对象。您对通知的担忧更加严重,因为通知是不断创建的。

于 2016-03-17T05:35:05.857 回答
1

在对Java方法的代码流进行了一些调试之后sendNotification:我的发现如下:

Flow of sendNotification Method: 
org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher
javax.management.modelmbean.RequiredModelMBean (Sendnotification)
javax.management.NotificationBroadcasterSupport

方法 inNotificationBroadcasterSupport向仅注册的侦听器发送通知(基于在listenersList类文件中)。如果没有注册监听器,那么它会跳过发送通知。

因此,我假设/得出结论,通知没有存储在任何地方。

正如@DavidS 建议的那样,如果我们在注册后未能 removeNotificationListener 并且不想接收通知,我们最终将让侦听器处理通知。内存泄漏的可能原因。

于 2016-03-17T07:21:10.217 回答