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