слишком много потоков от CachedThreadPool? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть следующие коды:

val executor = Executors.newScheduledThreadPool(4)

val futures = dataToProcess flatMap {
        case (name, dataByDate) =>
          dataByDate map {
            case (date, data) =>
              (name, date, data) -> executor.submit(new Callable[ProcessResult] {
                override def call() = {
                  val result = processor.process(...)
                  persist(result, name, date, data)
                  result
                }
              })
          }
      }

В processor.process() некоторые потоковые пулы ( Executors.newFixedThreadPool (64) ) используются для обработки данных. Эти пулы потоков не создаются на лету

В вышеприведенных кодах мы получили около 100К следующих ошибок: ... Exception in thread "Thread-129359954" java.lang.OutOfMemoryError: unable to create new native thread Exception in thread "Thread-129359959" java.lang.OutOfMemoryError: unable to create new native thread Exception in thread "Thread-129359963" java.lang.OutOfMemoryError: unable to create new native thread Exception in thread "Thread-129359966" java.lang.OutOfMemoryError: unable to create new native thread Exception in thread "Thread-129359970" java.lang.OutOfMemoryError: unable to create new native thread Exception in thread "Thread-129359978" java.lang.OutOfMemoryError: unable to create new native thread ....

Понятия не имею, почему создано так много тем. Любые комментарии приветствуются. Спасибо.

UPDATE

Я обнаружил, что в базе кода, которая является веб-приложением Java, в contextInitialized() некоторые пулы потоков (Executors.newCachedThreadPool() и Executors.newScheduledThreadPool(1)) создаются и повторно используются во многих случаях. Но shutdown() не вызывается явно в contextDestroyed(). Что произойдет, если эти пулы потоков не будут отключены явно. Интересно, является ли это причиной столь большого количества потоков.

1 Ответ

0 голосов
/ 11 сентября 2018

Как только ваше выполнение завершено, поток возвращается в пул. Даже если вы завершите работу, я предполагаю, что вы по-прежнему создаете слишком много параллельных сервисов-исполнителей. И выключение будет ждать завершения всех задач. Так что у вас будет конфликт ресурсов.

...