2016-11-11 15 views
0

我有一个使用Spring集成的Spring Boot应用程序。该应用程序从RabbitMQ队列中提取消息,转换该消息中的数据,聚合50个转换后的消息,将这些消息放入数组中,并将它们作为JSON发送到RESTful端点。我看到内存缓慢地爬起来,直到应用程序崩溃。为什么我的弹簧引导应用程序会随着时间的推移建立内存?

我跑了我们的应用程序探查并有建立随时间推移VariableLinkedBlockingQueue的实例。应用程序似乎在应用程序启动后将其清理干净,但过了一段时间后,应用程序将构建这些实例。我强制通过应用程序上的分析器完成垃圾收集,并清理了一些实例,但它们继续积累。这些实例只会在消息发送到队列时上涨。预取设置为50

为什么我看到这种情况下建立,如何解决这一问题?

+1

对于一些简单的启动应用程序来说,这对我们来说很有帮助。谢谢 –

+0

从我的经验来看,它主要是由应用程序本身的内存泄漏引起的,而不是底层框架。你有没有描述你的记忆? – luboskrnac

+0

我在描述中提到我在应用程序上运行了一个分析器。有些事情随着时间的推移不断增加。这些实例是com.rabbitmq.client.impl.VariableLinkedBlockingQueue 。我不确定这些情况来自哪里。经过研究,我可以猜到的是,这些都是为来自兔子的传入消息构建的实例。它似乎与线程相关,因为链接的阻塞队列在Java并发库中使用。虽然我不确定。 – Ivan

回答

0

com.rabbitmq.client.impl.WorkPool利用了VariableLinkedBlockingQueue,其逻辑基于注册/取消注册Channel作为客户端。

如果您正确关闭Channel,它们将从该池中未注册,因此它们的VariableLinkedBlockingQueue将被垃圾收集。

不是有你的应用程序查看和打法非常难以确定的是泄漏。

Spring集成AMQP支撑了一段时间已经存在,如果有这样的问题不要靠近通道,我们就已经知道了。

现在它看起来像你使用ConnectionFactory莫名其妙开箱和使用后关闭通道/连接不。

相关问题