2016-11-11 19 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莫名其妙開箱和使用後關閉通道/連接不。

相關問題