Непосредственной причиной является то, что вашей JVM не хватило памяти для создания стеков для новых потоков.
Первопричину определить сложнее:
Приложение может создавать ненужные или ненужные потоки.
Приложение может пропускать потоки при повторном развертывании.
Потоки могут блокироваться во время ввода-вывода (например, при чтении сокета) и никогда не возвращаться.
В пользовательском пуле потоков могут быть ошибки, приводящие к потере потоков.
Память, которая вам нужна для новых стеков, могла быть использована другими вещами; например по куче или в памяти отображенных файлов или не-куче выделения по коду JNI.
И так далее ...
Настройка размера стека потоков - это полосное решение, которое может работать в краткосрочной перспективе. Но в долгосрочной перспективе вам нужно выяснить, что на самом деле вызывает проблему.
Вы должны начать с настройки JVM для создания файла дампа в OOME и использовать анализатор дампа после смерти, чтобы увидеть, есть ли какие-либо подсказки; например много тем в неожиданных состояниях.