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