Утечка памяти при отправке лямбды в поток с скопированным списком - PullRequest
0 голосов
/ 11 июня 2018

У меня есть простой код, который опрашивает сообщения в выделенном потоке, группирует их в списке, а затем передает указанный список в другой поток, чтобы выполнить что-то, что включает блокировку.Вот упрощенная грубая аппроксимация:

class MessageProcessor extends MessagePoller implements Runnable {

  private final ExecutorService batchHandlerExec = Executors.newSingleThreadExecutor(); 
  private final List<Operation> operations = new ArrayList();

  //just to indicate this is a thread started somewhere
  public void run() { while(true) processMessage(); }

  public void processMessage() {
    Message msg = poll();

    operations.add(Operation.buildFrom(msg));

    if(operations.size() >= SOME_NUMBER) {
      List<Operations> batch = ImmutableCopy.copyOf(operations);

      batchHandlerExec.submit(() -> doSomethingBlockingWith(batch));

      operations.clear(); 
    }
  }
}

Итак, есть два потока, один из которых использует сообщения, а другой занимается чем-то другим.Проблема в том, что, учитывая пару дней, эти потоки перестали бы работать (хотя без весеннего утомления, хотя я использую весеннюю загрузку)

Короче говоря, я подозреваю, что утечка памяти убивает мой MessageProcessor, и пока я анализирую дампы кучи иНапример, было бы очень полезно, если бы кто-нибудь мог указать на то, что мне не хватает в этом фрагменте кода.В частности:

  • Я думаю, что Operation s не собираются, clear() работает?Я использую копию Guava ImmutableList, не выпуская ее, но я предполагал, что она будет собрана, так как doSomethingBlockingWith() выходит за рамки после выполнения того, что он делает
  • Мой реальный сервис-исполнитель тоже как singleThreadExecutor, так что, возможно, я ставлю большеработать с submit(), что он может обрабатывать (возможно, пакеты приходят быстрее, чем они обрабатываются), и что насчет кучи?

Я использовал jvisualvm и профилировалbit, включил подробный сборщик мусора, использовал jmap и прочее, но вся информация кажется мне загадочной.Пока что моя куча, кажется, всегда полна строк, длин и прочего, которые, похоже, удерживаются Operation, но я не знаю.Любая помощь приветствуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...