2016-11-11 8 views
0

У меня есть приложение Spring Boot, использующее Spring Integration. Приложение выводит сообщения из очереди RabbitMQ, преобразует данные из этого сообщения, агрегирует 50 преобразованных сообщений, помещает эти сообщения в массив и отправляет их в конечную точку RESTful как JSON. Я вижу, что память медленно ползет, пока приложение не сработает.Почему мое приложение Spring-Boot наращивает память с течением времени?

Я запустил профайлер в нашем приложении, и с течением времени появляются экземпляры VariableLinkedBlockingQueue. Приложение, похоже, очищает их после запуска приложения, но через некоторое время приложение просто наращивает эти экземпляры. Я заставил полную сборку мусора через профилировщик моего приложения, и он очистил некоторые экземпляры, но они продолжают расти. Эти экземпляры только повышаются, когда сообщения отправляются в очередь. Предварительная выборка установлена ​​на 50.

Почему я вижу, как эти экземпляры растут и как я могу это исправить?

+1

Было бы очень полезно использовать некоторые простые приложения для загрузки, чтобы играть с нашей стороны. Спасибо –

+0

По моему опыту, это в основном связано с утечкой памяти в самом приложении, а не в базовой структуре. Профилировали ли вы свою память? – luboskrnac

+0

Я упомянул в описании, что я запускал профилировщик в своем приложении. Были случаи, которые продолжали расти с течением времени. Примерами были com.rabbitmq.client.impl.VariableLinkedBlockingQueue . Я не уверен, откуда эти случаи. Изучив его, все, что я могу догадаться, это то, что это экземпляры для входящих сообщений от кролика. По-видимому, поток связан с тем, что связанные блокирующие очереди используются в библиотеке параллелизма Java. Хотя я не совсем уверен. – Ivan

ответ

0

com.rabbitmq.client.impl.WorkPool использует этот код VariableLinkedBlockingQueue, и его логика основана на регистрации/отмене регистрации Channel в качестве клиента.

Если вы закрыли Channel s правильно, они незарегистрированы из этого бассейна, и поэтому их VariableLinkedBlockingQueue - это сборщик мусора.

Невозможно определить, где находится утечка, ваше приложение для просмотра и воспроизведения.

Весенняя интеграция Поддержка AMQP существует уже некоторое время, и если возникла такая проблема, не закрывайте канал, мы уже это знаем.

Прямо сейчас, похоже, вы используете ConnectionFactory как-то из коробки и не закрываете каналы/соединения после использования.