2016-02-19 2 views
2

Я получаю сообщения от Kafka и обрабатываю их с помощью службы Executor, как показано ниже. Я не вызываю executorService.shutdown(). Иногда я вижу исключение heapSize, но не уверен, что это может быть одной из причин. Как удалить неиспользуемые экземпляры Runnable после завершения? Должен ли я делать что-либо конкретное, чтобы явным образом сделать его подходящим для GC?ExecutorService Shutdown - Kafka

public class Consumer implements CommandLineRunner{ 

    ExecutorService executorService; 
    executorService = Executors.newFixedThreadPool(50) 
    executorService.submit(runnable); 

    } 
} 

ответ

1

Из документации Executors.newFixedThreadPool:

Создает пул потоков, который повторно использует фиксированное количество потоков, работающих выкл общей неограниченной очереди. В любой момент, в большинстве случаев nThreads будут активными задачами обработки. Если дополнительные задачи отправляются , когда все потоки активны, они будут ждать в очереди до тех пор, пока не появится поток . Если какой-либо поток завершается из-за сбоя во время выполнения до выключения, новый новый будет заменен на место для выполнения последующих задач. Потоки в пуле будут существовать до , он явно отключается.

Для данного примера в пуле потоков будет задействовано не более 50 потоков, и они будут освобождены при вызове метода shutdown.

Если вы не храните ссылки на свои Runnable, они будут GCed, когда с ними будет выполнено Executor. Если вы выберете исключения из памяти, это может быть вызвано в очереди Runnable s в случаях, когда исполнитель не может идти в ногу с работой, представленной ему.

РЕДАКТИРОВАТЬ: Также исключаются исключения из памяти, если ваши задачи занимают много памяти (очевидно).