我JMX MBeans
在spring 4
框架中使用。我处理来自 JMX mBean 的通知并将它们作为事件处理。
为了测试替代方法,我只是注释掉了通知处理部分。这意味着我的 JMX Mbean 继续发布通知,而我只是忽略它们。
PS:我通过logstash
. 为了测试我已经注释掉了Logstash
配置
通知会发生什么?它将存储在哪里?它会影响应用程序中的内存/堆积吗?
我JMX MBeans
在spring 4
框架中使用。我处理来自 JMX mBean 的通知并将它们作为事件处理。
为了测试替代方法,我只是注释掉了通知处理部分。这意味着我的 JMX Mbean 继续发布通知,而我只是忽略它们。
PS:我通过logstash
. 为了测试我已经注释掉了Logstash
配置
通知会发生什么?它将存储在哪里?它会影响应用程序中的内存/堆积吗?
JMX 通知是观察者模式的一种实现。使用这种模式,不存储事件,因此不存在内存问题。
NotificationBroadcaster
Java文档:
当 MBean 发出通知时,它会考虑已使用 addNotificationListener 添加但随后未使用 removeNotificationListener 删除的每个侦听器。如果为该侦听器提供了一个过滤器,并且该过滤器的 isNotificationEnabled 方法返回 false,则该侦听器将被忽略。否则,将使用通知调用侦听器的 handleNotification 方法...
观察者模式链接指的是这个问题。需要明确的是,这个潜在的内存链接与您最初担心的(存储通知)不同。此内存泄漏是由未取消注册的侦听器引起的,例如 logstash 侦听器。如果一个监听器没有被注销,那么它可能不会被垃圾回收。
如果您对此感到担忧,则需要确认注释掉 logstash 配置会阻止侦听器首先注册(它可能确实如此)。无论如何,这对您来说可能不是问题,因为它只是一个侦听器对象。您对通知的担忧更加严重,因为通知是不断创建的。
在对Java方法的代码流进行了一些调试之后sendNotification
:我的发现如下:
Flow of sendNotification Method:
org.springframework.jmx.export.notification.ModelMBeanNotificationPublisher
javax.management.modelmbean.RequiredModelMBean (Sendnotification)
javax.management.NotificationBroadcasterSupport
方法 inNotificationBroadcasterSupport
向仅注册的侦听器发送通知(基于在listenersList
类文件中)。如果没有注册监听器,那么它会跳过发送通知。
因此,我假设/得出结论,通知没有存储在任何地方。
正如@DavidS 建议的那样,如果我们在注册后未能 removeNotificationListener 并且不想接收通知,我们最终将让侦听器处理通知。内存泄漏的可能原因。