Утечка памяти Akka

#java #scala #memory-leaks #akka

#java #scala #утечки памяти #akka

Вопрос:

Я пытаюсь найти утечку памяти в приложении Akka, и вот что я нашел в профилировщике:

введите описание изображения здесь Похоже, классы Envelope и Concurrentlink Queue вообще не собирают мусор.

Я нашел содержимое этих объектов конверта: введите описание изображения здесь

И вот код, который, я думаю, сгенерировал их:

 for (ActorRef actor : actors) {
        publisherCancels.add(system.scheduler().schedule(FiniteDuration.create(0, TimeUnit.MILLISECONDS),
                FiniteDuration.create(100, TimeUnit.MILLISECONDS), actor, "Run", system.dispatcher(), null));
}
  

Почему эти сообщения не собираются мусором? Как я могу исправить эту утечку?

Комментарии:

1. Что делает ваш актер?

2. Ваши сообщения накапливаются в каком-то почтовом ящике. Я бы сказал, что этот почтовый ящик не ограничен, и сообщения растут вечно, пока в JVM не закончится память.

3. @BobDalgleish У меня есть 5 участников (для взаимодействия с циклом через них), каждый из них получает это сообщение «Выполнить», чтобы начать работать. Эти субъекты в основном опрашивают MQ на наличие новых сообщений, а затем обрабатывают их.

4. @hveiga Да, выглядит так. Но почему они накапливаются? Я точно знаю, что этот механизм работает, но, возможно, интервал в 100 мс слишком велик для того, чтобы актер выполнял http-запрос к MQ?

5. Кажется, вы планируете это «запускать» сообщения каждые 100 мс. Почему бы вам не сделать это более основанным на событиях и вместо планирования каждые 100 мс просто отправлять сообщение «Выполнить» всякий раз, когда оно обрабатывалось? На мой взгляд, вашим участникам требуется более 100 мс для извлечения и обработки сообщений, и там для «запуска» сообщения накапливаются в памяти.