Скорее всего, вы создали тупик где-то в коде. Ключевым индикатором здесь является то, что, если под «зависанием» вы подразумеваете, что загрузка ЦП сервера падает до нуля, и на сервере больше не наблюдается никаких действий.
Когда сервер зависает, запустите jdk tool: jstack против его процесса. Это должно показать вам, что ждет на каком замке. Также в наборе инструментов есть jvisualvm , и если на коробке с Unix простой kill -3 pid
сделает дамп потока в stderr.
Без кода или, по крайней мере, воспроизводимого примера, боюсь, я не могу помочь намного больше. Одна вещь, на которую вы, возможно, захотите взглянуть, - это использование jetty в качестве встроенного сервера вместо ручного, они уже прошли через тупик / поточность, поэтому вам не нужно.